thinkPHP3.2使用RBAC实现权限管理的实现(2)

缓存权限列表,在这个方法可以传递空值的前提是:你在用户登录操作的时候要在 $_SESSION[C('USER_AUTH_KEY')] 中把用户的id保存下来,然后这里会将用户所对应的角色拥有的权限都保存在$_SESSION['_ACCESS_LIST']中

2:Rbac::checkAccess()

判断用户访问的模块和方法是否需要权限认证

3:Rbac::AccessDecision()

断用户是否有访问权限的,即检测当前项目模块操作 是否在$_SESSION['_ACCESS_LIST']数组中,也就是说 在 $_SESSION['_ACCESS_LIST'] 数组中$_SESSION'_ACCESS_LIST''当前控制器'是否存在。如果存在表示有权限 否则返回flase

4:Rbac::checkLogin();

判断用户是否登录,如果未登录则跳转到指定路径

5:Rbac::getAccessList($authId)

通过查询数据库 返回权限列表 $_SESSION['_ACCESS_LIST']的值

6:Rbac::authenticate($map, $model='')

传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息,如果不传model值的话使用配置项中的USER_AUTH_MODEL

四:权限管理简单实现实例:

1:登录:

//获取传递的用户名和密码 $username = I('post.username'); $password = I('post.password'); //生成认证条件 $map = array(); $map['username'] = $username; $map['status'] = array('eq', 1); //判断是否存在此用户 $authInfo = Rbac::authenticate($map); if (!$authInfo) { $this->error('账号不存在'); } if ($authInfo['password'] != md5($password)) { $this->error('密码错误'); } $user_id = $authInfo['user_id']; $role_user = new Model(); $role = $role_user->Table(C("RBAC_USER_TABLE"))->alias("user")->where("user_id=" . $user_id)->join(C("RBAC_ROLE_TABLE") . " as role ON role.id=user.role_id")->field("id,name")->find(); if (empty($role)) { $this->error('此用户无对应的角色,无法登录'); } //后台角色ID的SESSION标记 session(C('BACK_ROLE_ID'), $role['id']); //后台角色的SESSION标记 session(C('BACK_USER_ROLE'), $role['name']); //后台用户认证SESSION标记 session(C('USER_AUTH_KEY'), $authInfo['user_id']); //后台用户名的SESSION标记 session(C('BACK_LOGIN_NAME'), $authInfo['username']); //后台用户登录时间的SESSION标记 session(C('BACK_ONLINE_TIME'), time()); //判断用户角色是否为超级管理员 if ($role['id'] == '1') { //超级管理员将超级管理员的SESSION标记设置为true session(C('ADMIN_AUTH_KEY'), true); } // 缓存访问权限 Rbac::saveAccessList(); $this->success('登录成功', U('Index/index'));

2:登录成功后的权限校验:

//验证是否登录 Rbac::checkLogin(); // 用户权限检查 if (Rbac::checkAccess() && !Rbac::AccessDecision()) { // 没有权限 清除登录session 并抛出错误 if (C('RBAC_ERROR_PAGE')) { // 定义权限错误页面 redirect(C('RBAC_ERROR_PAGE')); } else { if (C('GUEST_AUTH_ON')) { //开启游客访问 } // 提示错误信息 $this->error(L('_VALID_ACCESS_')); } } //自动退出功能,判断后台用户登录时间的SESSION标记是否超时 if (session(C('BACK_ONLINE_TIME')) + C('ONLINE_INTERVAL') * 60 < time()) { if (session('?' . C('USER_AUTH_KEY'))) { session('[destroy]'); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 3600, 'https://www.jb51.net/'); } session_destroy(); } $this->error('超时请重新登录', U('Login/index')); } else { session(C('BACK_ONLINE_TIME'), time()); }

根据如上就可以实现用户角色的权限管理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e8238a992b11baf6061e0367a3363afa.html