tp6实现商城后台登录功能

后台登录逻辑

1、没有登录状态,访问后台页面都应该跳转到登录页
已经登录状态:
1、访问登录页面,应该跳转到后台首页

解决方案:
后台登录拦截:
1、传统common/base.php控制器,后台控制器都去继承base父类,在base控制器中做登录拦截
2、后台应用中间件(这里多应用,不做全局中间件)的前置操作校验做登录拦截

后台登录功能实现-01

1、开启验证验证码

2、后台校验提交数据
1)是否为post提交
2)验证码是否正确(需要开启全局中间件的session)
3)验证用户名为条件查询是否存在数据库
4)验证用户状态status是否为激活状态
5)密码校验采用加密盐+md5方式加密验证是否正确
6)保存用户信息到session中实现多页面登录状态与展示用户信息
7)更新该用户的登录时间
8)验证成功跳转到后台首页
9)登录后再次访问登录页根据session值重定向到后台首页

后台管理员表结构
CREATE TABLE `qing_admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `password` char(32) COLLATE utf8_unicode_ci NOT NULL,
  `last_login_time` int(11) NOT NULL,
  `group_id` int(2) NOT NULL,
  `status` int(11) NOT NULL DEFAULT '1' COMMENT '1启用0禁用',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='后台管理员';
实现代码
public function index()
    {
    	//9)登录后再次访问登录页根据session值重定向到后台首页
    	if(session('adminSessionData')){
            return redirect('/qingadmin/index');
        }
        
        if (request()->isPost()) {
            $data = input('post.');
            //验证码校验
            if (!captcha_check($data['verifycode'])) {
                return alert('验证码错误', 'index', 5);
            };
            //验证码用户名
            $adminData = Db::name('admin')->where('user_name', $data['username'])->find();
            if (!$adminData) {
                return alert('用户名错误', 'index', 5);
            }
            //如果管理员有状态,status=1合法  0禁止
            if ($adminData['status'] == 0) {
                return alert('您的账号被禁止登录', 'index', 5);
            }

            //密码校验
            $salt = 'zxcvbn';
            if ($adminData['password'] != md5($salt . $data['password'])) {
                return alert('密码错误', 'index', 5);
            }

            Db::name('admin')->where('id', $adminData['id'])->update(['last_login_time' => time()]);
            session('adminSessionData', $adminData);

            return alert('登录成功', '/qingadmin/index/index', 6);
        } else {
            return view();
        }
    }

后台登录退出-02

登录退出功能:
1、清空键名为adminSessionData的用户信息
2、tp方法redirect()重定向回到登录页面

实现代码
 public function logout(){
        session('adminSessionData',null);
        return redirect('/qingadmin/login/index');
    }

前置后台应用中间件-03

1、判断用户信息session(‘adminSessionData’)获取不到,并且不是login登录提交的数据,则重定向到登录页
2、需要注意的是登录页是没有校验用户登录session信息,在加入判断是login登录页不进行重定向,防止多次重定向问题

使用

定义中间件,并将middleware/Check.php与middleware,php文件移动至后台qingadmin文件夹下

php think make:middleware Check

Check.php判断逻辑实现代码

<?php
declare (strict_types = 1);

namespace app\qingadmin\middleware;

class Check
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    //前置中间件
    public function handle($request, \Closure $next)
    {
        if(empty(session('adminSessionData')) && !preg_match('/login/',$request->pathinfo())){
            return redirect((string) url('login/index'));
        }
        return $next($request);
    }
}

middleware.php使用中间判断逻辑

<?php
// 后台应用中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
     \think\middleware\SessionInit::class,
     \app\qingadmin\middleware\Check::class,
];