基于角色的访问控制( Role-Based Access Control ),是一种简单的而又强大的集中访问控制。基于Yii Framework 的 authManager 组件实现了分等级的 RBAC,能够帮助我们解决开发中遇到一些资源控制访问的问题。

Yii的rbac,从开始安装arbc模块扩展,到调试分析其原理,断断续续地也花了不少时间。当然你了解它后,你会发现,yii的abrc是多的方便,可以让你轻松实现资源控制访问,非常强大。现在就整理下学习笔记,分享一下。虽然authMangner组件实现了rbac,但是没有实现可视化编辑管理。目前官方有Srbac 和 Right两个比较好的扩展模块,我们用它们非常方便的可视化管理角色(roles),任务(tasks),操作(operations)。

它们的界面操作风格如下:


对于这两个扩展模块,其实功能都差不多的,只是界面上的不同。看个人喜欢什么风格,就选择那个模块测试。至于安装调试,你只要下载它们,里面有详细介绍。下面我们分析下authManager 组件实现的原理。

授权项目,就是判断一个用户是否允许操作特定的资源,通过检查用户是否属于有权限访问该项资源的角色来判断。这里我们要明白,授权项目,角色,任务,操作之间的关系。

1.授权项目可分为,角色,任务,操作;

2.角色可以由若干个任务组成;

3.任务可以有若干个操作组成;

4.操作就是一个许可,不可在分。

这里也还要提到,业务规则问题,它其实就是一段php代码,在检查权限的时候会被执行。

下面我们分析下rbac实现中,需要三张表:authassignment、authitem、authitemchild的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * authassignment表
 * 记录 用户->角色 之间的对应关系
 */
 
itemname varchar(64) 角色名称,区分大小写
userid   varchar(64) 用户ID,是自己项目中用户表的id
bizrule  text        业务规则,一段php code
data     text        序列化后的数组,用于给bizrule提供参数
 
 
/**
 * authitem 表
 * 记录 RBAC 中的对象
 */
name varchar(64) authassignment中的itemname相同
type integer     类型标识(0,1,2)
        |
        |-------- 0 表示 Operation 操作
        |-------- 1 表示 Task 任务
        |-------- 2 表示 Role 角色
 
description  text    相关描述
bizrule  text        业务规则,一段php code
data     text        序列化后的数组,用于给bizrule提供参数
 
 
/**
 * authitemchild 表
 * 记录 角色->任务 、 角色->操作 和 任务->操作 之间的对应关系
 */
parent    varchar(64) 父级名称,[角色名,也可以是任务];
children  varchar(64) 子对象名称。[任务名,也可以是操作];

使用验证方法CWebUser::checkAccess(),下面用一段demo code说明:

1
2
3
4
if(Yii::app()->user->checkAccess(what,$params)) {
    //what    --- role,或者task,也可以是operation,
    //params  --- 是传进业务规则的参数key-value;
 }

下面就演示一下具体的一个用户删除文章的操作:

1
2
3
4
5
6
7
8
9
10
11
/**
 * role author
 * Operation delArticle
 * bizrule return (Yii::app()->user->id==$params['uid']->uid);
 */
$params=array('uid'=>$id);
if(Yii::app()->user->checkAccess('delArticle',$params)) {
    //检查当前用户是否有删除文章权限
    //并且使用业务规则,检查用户id等于文章里面的作者id
    //通过验证,就执行删除操作
}

 

YII RBAC基于角色的访问控制的更多相关文章

  1. RBAC基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  2. RBAC 基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  3. RBAC: 基于角色的访问控制(Role-Based Access Control)

    本文只讨论两种基于角色的访问控制的不同点,不涉及权限设计的数据库设计. 基于角色的访问控制(Role-Based Access Control)可分为隐式角色访问控制和显式角色访问控制. 隐式角色访问 ...

  4. Yii中 RBAC(基于角色的访问控制权限)表结构原理分析

    这里有几个概念很重要,我简单用大白话说一下; 权限:就是指用户是否可以执行哪些操作. 如:小张可以发帖.回帖.浏览,小红只能回帖.浏览 角色:就是上面说的一组操作的集合. 如:高级会员有发帖.回帖.删 ...

  5. RBAC(基于角色的访问控制权限)表结构

    Rbac 支持两种类,PhpManager(基于文件的) 和 DbManager(基于数据库的) 权限:就是指用户是否可以执行哪些操作 角色:就是上面说的一组操作的集合,角色还可以继承 在Yii2.0 ...

  6. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

  7. RBAC(Role-Based Access Control,基于角色的访问控制)

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  8. RBAC(Role-Based Access Control)基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  9. Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role

    <Windows Azure Platform 系列文章目录> 今天上午刚刚和客户沟通过,趁热打铁写一篇Blog. 熟悉Microsoft Azure平台的读者都知道,在老的Classic ...

随机推荐

  1. POJ 1273 Drainage Ditches(最大流Dinic 模板)

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n, ...

  2. bs4--官文--修改文档树

    修改文档树 Beautiful Soup的强项是文档树的搜索,但同时也可以方便的修改文档树 修改tag的名称和属性 在 Attributes 的章节中已经介绍过这个功能,但是再看一遍也无妨. 重命名一 ...

  3. final,buaa_oo conclusion

    UML系列作业设计架构 第13次作业 本单元的第一次作业中,涉及到了类图的解析.在着手做这单元作业的时候,需要将每一种 UmlElement 再封装,并在解析时,用 helper 单例来进行查询处理( ...

  4. Hive 执行查询语句报错,由于内存空间不足导致

    org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Can ...

  5. 用openrowset函数操作远程数据库

    OPENROWSET 包含访问 OLE DB 数据源中的远程数据所需的全部连接信息.当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的.特殊的 ...

  6. [转]pickle python数据存储

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  7. Java包(package)详解

    java包的作用是为了区别类名的命名空间 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用.. 2.如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包 ...

  8. 【JavaScript 11—应用总结】:下拉菜单

    导读:在web页面的显示中,总是免不了下拉菜单的设置.怎样将菜单设置的更好玩一点呢?这次,就将实现一个下拉菜单的制作.当鼠标移入的时候,菜单显示,鼠标移走,菜单关闭. 一.实现分析 首先,制作一个下拉 ...

  9. 【C#】重写和重载的区别

    导读:学习C#的时候,其实没想那么多的.就想着把视频看完,把例子做一下就好了,其实真心不懂那些玩意儿是什么,就好像是又回到了学VB的时候.可是,边上师哥压榨我这本就不聪明的脑袋瓜,问了我好多问题,于是 ...

  10. Spring JdbcTemplate 查询方法中的RowMapper实现汇总

    实现一.在内部建立内联类实现RowMapper接口 package hysteria.contact.dao.impl; import java.sql.ResultSet; import java. ...