作者:她们都叫我哥 | 来源:互联网 | 2024-11-14 18:27
本文将详细介绍ThinkPHP框架中的RBAC(角色基础访问控制)系统,特别是登录验证部分。我们将通过实际代码示例,展示如何实现用户登录验证、验证码生成及验证、以及登录后的权限管理。
在上一节中,我们已经介绍了 RBAC 的基本流程。本节将通过实际代码来深入探讨登录验证部分。
登录验证的主要任务是确保用户输入的用户名、密码和验证码正确无误。为此,我们可以创建一个公共类 CommonAction
来处理权限校验,其他所有类都可以继承这个公共类。该类内部包含一个初始化方法,用于进行权限验证。
由于登录是一个公开模块,我们可以创建一个 PublicAction
类,专门用于处理不需要权限验证的公共方法。同时,在配置文件中添加以下设置:
'NOT_AUTH_MODULE' => 'Public', // 默认不需要认证的模块
'USER_AUTH_GATEWAY' => '/Public/login', // 默认的认证网关
接下来,我们开始编写 PublicAction
类的具体代码:
error('用户名不能为空!');
} elseif (empty($_POST['password'])) {
$this->error('密码不能为空!');
} elseif (empty($_POST['verify'])) {
$this->error('验证码不能为空!');
}
$map = array();
$map['username'] = $_POST['username'];
$map['status'] = array('gt', 0);
if ($_SESSION['verify'] != md5($_POST['verify'])) {
$this->error('验证码错误!');
}
import('ORG.Util.RBAC');
$authInfo = RBAC::authenticate($map);
if (empty($authInfo)) {
$this->error('账号不存在或已被禁用!');
} else {
if ($authInfo['password'] != md5($_POST['password'])) {
$this->error('账号密码错误!');
} else {
$_SESSION[C('USER_AUTH_KEY')] = $authInfo['id'];
$_SESSION['email'] = $authInfo['email'];
$_SESSION['nickname'] = $authInfo['nickname'];
$_SESSION['user'] = $authInfo['username'];
$_SESSION['last_login_date'] = $authInfo['last_login_date'];
$_SESSION['last_login_ip'] = $authInfo['last_login_ip'];
if ($authInfo['username'] == 'admin') {
$_SESSION[C('ADMIN_AUTH_KEY')] = true;
}
// 记录本次登录信息
$user = M('User');
$lastdate = date('Y-m-d H:i:s');
$data = array(
'id' => $authInfo['id'],
'last_login_date' => $lastdate,
'last_login_ip' => $_SERVER['REMOTE_ADDR']
);
$user->save($data);
RBAC::saveAccessList();
$this->assign('jumpUrl', './Index/index');
$this->success('登录成功!');
}
}
}
// 退出登录操作
public function logout() {
if (!empty($_SESSION[C('USER_AUTH_KEY')])) {
unset($_SESSION[C('USER_AUTH_KEY')]);
$_SESSION = array();
session_destroy();
$this->assign('jumpUrl', '/Code/login');
$this->success('登出成功');
} else {
$this->error('您已登出');
}
}
}
以上代码实现了基本的登录验证功能。为了提高代码质量和可维护性,建议将一些验证操作移至模型(Model)中,并使用数组来简化 session 赋值。对于已经熟悉 ThinkPHP 的开发者来说,这些优化应该不难实现。
AD:真正免费,域名 + 虚机 + 企业邮箱 = 0 元