一、什么是RBAC

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

二、ThinkPHP中的RBAC

先看下官方给的实例所用到的数据表,通过5张表实现权限控制,定义如下:

RBAC 要用到5个数据表

think_user (用户表)

think_role (用户分组表)

think_node (操作节点)

think_role_user (用户和用户分组的对应)

think_access (各个操作和用户组的对应)

用户表

角色表,有哪些角色,该角色与对应的userid用户相关联

根据用户表的id给出对应的角色id相关联,也就是给用户分配角色,比如userid为3的角色为2,根据role角色表,7代表员工的角色

access表,权限表,比如角色id为2,也就是员工的权限,可以的对应的结点

结点表,代表有哪些应用-模块-模块方法,并且定义了之间的一种关系,比如noteid为30的是Public模块,noteid为31,32,33,34的方法add,insert,edit,update都属于Public。noteid为85的test方法,属于noteid为84的Game模块下的方法。

字段name就是当项目,模块或者操作的名称了。

字段PID 记录他们的从属关系,比如某一个模块是属于哪个项目,某个操作属于哪个模块。

字段level 表示该节点的层级 换句话就是说 level=1 为项目 ,level=2为模块 ,level=3就是操作了,比如说 admin项目,他的PID 就是 0 (项目的PID都是0) level就是1,nane就是admin了,admin项目下面有的user模块,它的level就应该是2,pid就是admin的id, admin下面user模块的add操作,level就该是3了,pid就应该是前面的user对应的ID.

三、config配置文件详解

我们看看thinkphp官方示例中的config文件:

 
 
 
 
 
 

PHP

 
array(
'APP_AUTOLOAD_PATH'=>'@.TagLib',
'SESSION_AUTO_START'=>true,
'USER_AUTH_ON' =>true,
'USER_AUTH_TYPE' =>1, // 默认认证类型 1 登录认证 2 实时认证
'USER_AUTH_KEY' =>'authId', // 用户认证SESSION标记
'ADMIN_AUTH_KEY' =>'administrator',
'USER_AUTH_MODEL' =>'User', // 默认验证数据表模型
'AUTH_PWD_ENCODER' =>'md5', // 用户认证密码加密方式
'USER_AUTH_GATEWAY' =>'/Public/login',// 默认认证网关
'NOT_AUTH_MODULE' =>'Public', // 默认无需认证模块
'REQUIRE_AUTH_MODULE' =>'', // 默认需要认证模块
'NOT_AUTH_ACTION' =>'', // 默认无需认证操作
'REQUIRE_AUTH_ACTION' =>'', // 默认需要认证操作
'GUEST_AUTH_ON' =>false, // 是否开启游客授权访问
'GUEST_AUTH_ID' =>0, // 游客的用户ID
'DB_LIKE_FIELDS' =>'title|remark',
'RBAC_ROLE_TABLE' =>'think_role',
'RBAC_USER_TABLE' =>'think_role_user',
'RBAC_ACCESS_TABLE' =>'think_access',
'RBAC_NODE_TABLE' =>'think_node',
'SHOW_PAGE_TRACE'=>1//显示调试信息
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
array(
        'APP_AUTOLOAD_PATH'=>'@.TagLib',
        'SESSION_AUTO_START'=>true,
        'USER_AUTH_ON'              =>true,
        'USER_AUTH_TYPE' =>1, // 默认认证类型 1 登录认证 2 实时认证
        'USER_AUTH_KEY'             =>'authId', // 用户认证SESSION标记
        'ADMIN_AUTH_KEY' =>'administrator',
        'USER_AUTH_MODEL'           =>'User', // 默认验证数据表模型
        'AUTH_PWD_ENCODER'          =>'md5', // 用户认证密码加密方式
        'USER_AUTH_GATEWAY'         =>'/Public/login',// 默认认证网关
        'NOT_AUTH_MODULE'           =>'Public', // 默认无需认证模块
        'REQUIRE_AUTH_MODULE'       =>'', // 默认需要认证模块
        'NOT_AUTH_ACTION'           =>'', // 默认无需认证操作
        'REQUIRE_AUTH_ACTION'       =>'', // 默认需要认证操作
        'GUEST_AUTH_ON'             =>false,    // 是否开启游客授权访问
        'GUEST_AUTH_ID'             =>0,        // 游客的用户ID
        'DB_LIKE_FIELDS'            =>'title|remark',
        'RBAC_ROLE_TABLE'           =>'think_role',
        'RBAC_USER_TABLE'           =>'think_role_user',
        'RBAC_ACCESS_TABLE'         =>'think_access',
        'RBAC_NODE_TABLE'           =>'think_node',
        'SHOW_PAGE_TRACE'=>1//显示调试信息
    );

大家看注释就应该懂大半了,其中Public模块是无需认证的,道理很简单,没登录之前大家都是游客身份,如果登录页面也要权限,那从哪里登录呢?是吧,呵呵。默认网关地址就是认证失败,没有权限跳转到此处,重新登陆。ADMIN_AUTH_KEY表示超级管理员权限,如果你在user表建立一个名为admin的用户,那么这个用户就是超级管理员,不用给它分配权限,什么权限都有,为什么要设置一个这样的管理员,因为当你把权限分配错了容易引起系统权限混乱,搞得大家都访问不了,这时候超级管理员就来了。

四、RBAC类的几个重要的方法

authenticate($map,$model=”)方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息

saveAccessList($authId=null)方法 传入用户的ID 此方法不返回值,只是设置 $_SESSION[‘_ACCESS_LIST’]的值,其中包含了所有该用户对应的用户组的有权限操作的所有节点 $_SESSION[‘_ACCESS_LIST’][‘项目名’][‘模块名’][‘操作名’],以后判断权限就是判断当前项目,模块和操作是否在 $_SESSION[‘_ACCESS_LIST’]中能找到。s

checkAccess() 方法 检测当前模块和操作是否需要验证 返回bool类型

checkLogin()方法 检测登录

AccessDecision($appName=APP_NAME) 方法 就是检测当前项目模块操作 是否在$_SESSION[‘_ACCESS_LIST’]数组中,也就是说 在 $_SESSION[‘_ACCESS_LIST’] 数组中$_SESSION[‘_ACCESS_LIST’][‘当前操作’][‘当前模块’][‘当前操作’]是否存在。如果存在表示有权限 否则返回flase。

getAccessList($authId) 方法 通过查询数据库 返回权限列表 $_SESSION[‘_ACCESS_LIST’]的值了。

ThinkPHP---RBAC的更多相关文章

  1. ThinkPHP RBAC权限管理机制

    RBAC是ThinkPHP很好用的后台权限管理的,话不多说,实现方法如下,也方便以后自己查询使用: 1.新建4个数据库表 self_role权限表 CREATE TABLE `self_role` ( ...

  2. ThinkPhp RBAC实现原理

    RBAC是英文Role-Based Access Control的缩写,是基于角色访问进行控制的机制.意思是给每个用户设定一个角色,然后根据这个角色来判断用户的权限. 在此基于ThinkPhp的MVC ...

  3. ThinkPHP3.2开发仿京东商城项目实战视频教程

    ThinkPHP3.2仿京东商城视频教程实战课程,ThinkPHP3.2开发大型商城项目实战视频 第一天 1.项目说明 2.时间插件.XSS过滤.在线编辑器使用 3.商品的删除 4.商品的修改完成-一 ...

  4. PHP教程专题资源免费下载地址收藏

     PHP教程专题资源免费下载地址收藏 PHP,即Hypertext Preprocessor,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去.它的语法利用了 C. ...

  5. RBAC在thinkphp中有Auth类 可以很好的实现权限控制

    import('ORG.Util.Auth');//加载类库 $auth=new Auth(); if($auth->check('show_button',1)){// 第一个参数是规则名称, ...

  6. ThinkPHP的RBAC

    基于角色的访问控制(Role-Based Access Control) 在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限. ThinkPHP通过5张表实现权限控制 th ...

  7. ThinkPHP 3.2.3 简单后台模块开发(二)RBAC

    RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ...

  8. ThinkPHP的Rbac权限控制

    RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ...

  9. ThinkPHP中RBAC权限带菜单栏显示和详细权限操作

    RBAC是什么,能解决什么难题? RBAC是Role-Based Access Control的首字母,译成中文即基于角色的权限访问控制,说白了也就是用户通过角色与权限进行关联[其架构灵感来源于操作系 ...

  10. ThinkPHP中RBAC权限管理的简单应用

    RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...

随机推荐

  1. 1352 - Colored Cubes (枚举方法)

    There are several colored cubes. All of them are of the same size but they may be colored differentl ...

  2. Android KeyCode(官方)

    Constants public static final int ACTION_DOWN Added in API level 1 getAction() value: the key has be ...

  3. 技术回归01-Windows内存分配工具

    很久没有写技术方面的东西了,这半年主要是在学习别人的东西,对自己提高比较大,算是一次技术回笼吧,这次学习之旅目的是结束技术方面的专注,开始向应用方面找突破口,也就是完成技术积累或者为技术的积累做坚实的 ...

  4. NM_CUSTOMDRAW 消息

    When the control first starts to paint itself, in response to a WM_PAINT, you receive a NM_CUSTOMDRA ...

  5. Boost的安装与使用(整整83篇)

    http://www.cnblogs.com/lidabo/category/542245.html

  6. Ural 1073 Square Country (DP)

    题目地址:Ural 1073 DP水题.也能够说是背包. #include <iostream> #include <cstdio> #include <string&g ...

  7. How to initialize a static const map in c++?

    #include <map> using namespace std; struct A{ static map<int,int> create_map() { map< ...

  8. Highcharts将数据以图表的形式展现

    1.首先将Highcharts插件所需的js跟css样式文件引入项目中,下载地址为:Highcharts.rar 2.在前台页面中添加一个存放图表的容器 <div id="contai ...

  9. Nginx和Tomcat负载均衡实现session共享(转)

    以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡,为了实现多个Tomcat之间的session共享,使用了开源的Memcached-Session-Manager框架. 此框架的优 ...

  10. hdu1573-X问题

    http://acm.hdu.edu.cn/showproblem.php?pid=1573 中国剩余定理 #include<iostream> #include<cstdio> ...