后台登录逻辑
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,
];