RBAC 基于角色的访问控制演示

Posted 白超华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RBAC 基于角色的访问控制演示相关的知识,希望对你有一定的参考价值。

RBAC


rbac:Role Based Access Controll,基于角色的访问控制。

今天理一理RBAC,话不多说,直接切入主题

 

功能需求:

  1. 权限管理(无限极)
  2. 角色管理(可以分配权限)
  3. 管理员管理(管理员属于哪些角色)
  4. 后台左侧显示当前登录用户所拥有的权限
  5. 超级管理员拥有所有权限

实现

建表(我们需要三个表,管理员表、角色表、权限表,tip:也可用其它建表方式)

管理员表

权限表

角色表

我制作完的三张表的CRUD,后台首页效果展示(具体的增删改查就不列步骤了):

管理员表

权限表

角色表

 

 功能一实现-无限极权限分类


 

  在这里实现无限极分类不是通过递归,而是通过建表时候多加的一个字段 auth_path

 

不懂的看我另一篇博文有写不使用递归实现无限极,这里就不多说了

功能二实现-角色管理分配权限


 

页面实现

视图显示没有什么可说的,有需要源码的、有问题的留言,收集表单信息(tp代码示意)

然后我们讲得到的数组转换成字符串,通过字符串查询所有权限信息

返回数组

接下来拼接字段role_auth_ac,通过get过来的角色id更新数据库

 

 1     public function saveAuth($arr,$role_id){
 2         $str = implode(\',\',$arr);
 3         $str = rtrim($str);
 4         
 5         $auth_info = D(\'Auth\')->select($str);
 6         $s = \'\';//用于拼接 role_auth_ac 字段
 7         foreach($auth_info as $v){
 8             if(!empty($v[\'auth_c\']) && !empty($v[\'auth_a\'])){
 9                  $s .= $v[\'auth_c\'] .\'-\'. $v[\'auth_a\'].\',\';               
10             }
11         }
12         $s = rtrim($s,\',\');
13         $sql = "update jy_role set role_auth_ids = \'$str\',role_auth_ac = \'$s\' where role_id = $role_id";
14         return $this->execute($sql);
15     }

 

功能三实现-管理员属于的角色


 

 

 

功能四/五 实现-登录左侧显示所拥有权限


比如我现在用另一个账号登录,(只显示他有的权限) 

基本思想就是,首先登录后将管理员的角色id获得,不同的角色id根据数据库里的数据显示不同权限菜单,如下,我的jy_test只有两个权限

 

视图中显示如下

 

tp代码示意

        $admin_id = session("admin_info[\'admin_id\']");//管理员id
     
        $admin_info = D(\'Admin\')->find($admin_id);//管理员信息
        $role_id = $admin_info[\'role_id\'];//管理员角色id
        
        //角色信息
        $role_info = M(\'Role\')->find($role_id);
        //角色拥有的权限字符串
        $auth_ids = $role_info[\'role_auth_ids\'];
        
        if($role_id === 0){
            //超级管理员获取所有权限菜单
           $auth_infoA = M(\'Auth\')->where("auth_level = 0")->select();  //顶级权限
           $auth_infoB = M(\'Auth\')->where("auth_level = 1")->select();  //次顶级权限 
        }else{
            $auth_infoA = M(\'Auth\')->where("auth_level = 0 and auth_id in ($auth_ids)")->select();  //顶级权限
            $auth_infoB = M(\'Auth\')->where("auth_level = 1 and auth_id in ($auth_ids)")->select();  //次顶级权限

后记:只是大致笼统粗糙的说了下流程,有需要源码和有问题的可以私我!

 

 

 

 

以上是关于RBAC 基于角色的访问控制演示的主要内容,如果未能解决你的问题,请参考以下文章

Flask实现基于角色的访问控制(RBAC)

RBAC基于角色的访问控制

RBAC 基于角色的访问控制

RBAC:基于角色的权限访问控制

基于角色的访问控制 (RBAC)权限管理

一个实例:基于RBAC理论的访问控制实践