权限管理(AUTH)原理

作者: jiukeshuju 分类: THINKPHP 发布时间: 2020-01-22 05:35
  • 最简单的auth权限管理的4张数据表如下图
  • 每一个功能对应的一个url路径,规则表其实就是记录url路径,通过url来实现权限管理
权限验证时机分类
  • 前置验证
    所谓前置认证,就是当前可访问的页面内部元素在显示前就进行权限验证。例如:游客访问网页时,看不到某个功能菜单,但管理员能看到等。前置验证用户体验好,但性能差点
  • 后置认证
    所谓后置认证,这个就简单,就是每个功能访问时先进行权限验证。例如,在页面上点击‘添加栏目’按钮,先进行验证,通过才执行添加栏目功能代码。后置验证用户体验差,但性能好
权限验证代码实现位置
  • 在用户成功登陆后台后,后台所有菜单、导航、按钮的操作就必须进行权限验证
  • 但后台首页、欢迎页、用户退出等功能可无需权限验证,根据具体项目需求来订
AUTH权限管理与RBAC权限管理的区别
  • 相同点:都是基于角色的权限管理
  • 不同点:数据表的设计不同,导致AUTH更灵活、权限管理更细腻
权限模块设计

1.将auth类下载好 放置目录: extend\auth\auth.php

2.将类中的SQL语句执行,可以在数据库中创建3张表 auth_group(用户组表)           auth_rule(权限规则表)           auth_group_access(用户与用户组关联表)

3.我想给规则 添加一个级别关系(类似于无限极分类)   auth_rule(权限规则表) 中添加3个字段  pid(父级id ,0为顶级权限)   level(级别)    sort(排序),如下图

4,首先 自己创建管理员表,比如叫admin表,增删改查 自己去正常设计,group字段为所属用户组

5.auth_group用户组的 增删改查 也自己去制作一下,id,用户组名称,状态(开启,或者关闭),规则(所对应的是规则表的id)

6.auth_rule规则表 增删改查 也自己去制作一下,id,name(控制器/方法),title(规则名称 )  status状态(开启,或者关闭),

7. 在添加用户的时候 给用户选择 所属用户组, uid(对应的是用户id)   group_id(对应的是用户所属用户组的id),这样就关联起来了

8.把会员登陆功能做好,登陆成功设置session(‘id’),将当前登陆会员ID存在session中

9.最关键的的一步,就是使用auth类进行验证,在common.php这个公共页面中 使用

复制代码
 1 <?php
 2 namespace app\admin\controller;
 3 use think\Controller;
 4 use think\Request;
 5 use auth\Auth; //引入suth类
 6 class Common extends Controller 
 7 {    
 8     public function _initialize(){
 9       //初始化判断用户是否已经登陆
10       if(!session('uname')){  
11           $this->error('请先登陆系统!','login/index');
12         }
13 
14 
15         //获得当前页面的控制器 / 方法   
16        $request=Request::instance();
17        $moudle=$request->module(); //获取当前控制器名称
18        $con=$request->controller(); //获取当前控制器名称
19        $action=$request->action();  //获取当前方法名称
20        $this->assign(array(
21                'con'=>$con,
22                'action'=>$action,
23        ));
24        
25        $rules=$con.'/'.$action;  //组合  控制器/方法
26        $auth=new Auth(); //实例化auth类
27        $notCheck=array('Index/index');  //都可以访问的页面
28        if(session('uid')!=1){  //不是超级管理员才进行权限判断
29           if(!in_array($rules,$notCheck)){  // 是否在开放权限里面
30               if(!$auth->check($rules,session('uid'))){   // 第一个参数  控制/方法   第二个参数:当前登陆会员的id
31                  $this->error('没有权限','index/index');
32                };
33            } 
34         }
35 
36        
37        
38        
39        }
复制代码

最终展示;

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注