基于角色的访问控制( 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. H.264 Profile-level-id

    基于SIP协议的VOIP通信,该字段通常位于视频协商sdp报文中,如: video RTP/AVP rtpmap: H264/ fmtp: profile-level-id=42801E; packe ...

  2. LDAP学习小结【仅原理和基础篇】

    此篇文章花费了好几个晚上,大部分是软件翻译的英文文档,加上自己的理解所写,希望学习者能尊重每个人的努力. 我有句话想送给每个看我文章的人: 慢就是快,快就是慢!!! 另外更希望更多人能从认真从原理学习 ...

  3. 关于Linux下安装Oracle时报错:out of memory的问题分析说明

    一.说明 在Oracle安装过程中,可能遇到out of memory这种错误,这是由于系统内存不足导致!我们可以通过加内存的方式解决! 而如果是另一种情况呢: 例如我在主机上装了两个Oracle服务 ...

  4. Java设计模式学习二

    Java设计思想之单例模式 单例模式(Singleton Pattern)是Java中最常见的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的 ...

  5. 分离焦虑OR责任焦虑

     这里是用小孩上幼儿园的事说分离焦虑,转念到成人身上就是责任焦虑.        这周小孩开始上幼儿园了,他很害怕家长离开,我能做的也不多,只是很肯定的告诉他,爸爸就在停车场,下学就来接你,然后从各个 ...

  6. C/C++复杂类型声明

    曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明.   我们将从每天都能碰到的较 ...

  7. 【Openjudge】岛屿(并查集)

    题目链接 此题是并查集.考虑到水位不断上涨,所以将时间倒转.先统计最后一天的联通块个数,每一天浮出水面的块进行计算.复杂度O(玄学). 代码如下 #include<cstdio> #inc ...

  8. mysql5.7.23版本环境配置

    亲身实践安装mysql,用时居然花费了三个小时,在有那么多教程的情况下,依然在不该花费时间的路上浪费了太多时间.希望这篇文章能够帮助大家少走弯路~~ 1.下载我下载的是64位. 2.解压下载之后,我选 ...

  9. 纯干货,Mysql innodb的ACID特性是怎么实现的?以及高并发情况下会出现的问题

    首先说说什么是ACID: 它们分别是Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Transaction(持久性) 原子性: 意为单个事务里的多个操作要 ...

  10. hdu 4960 记忆化搜索 DP

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...