基于角色的访问控制( 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. LeetCode(125) Valid Palindrome

    题目 Given a string, determine if it is a palindrome, considering only alphanumeric characters and ign ...

  2. sublime_win配置

    让你用sublime写出最完美的python代码--windows环境 点击上方标题查看原文链接, 感谢大佬 至少很长一段时间内,我个人用的一直是pycharm,也感觉挺好用的,也没啥大毛病 但是py ...

  3. PowerShell-第3章 变量与对象

    3.1 在变量中存储信息 假如说变量存储了大量数据,且不用了,可以赋值为$null,则可以释放变量占用的内存空间. 3.2 访问环境变量 获得所有环境变量 Get-ChildItem env: 获得某 ...

  4. lnmp环境运行laravel open_basedir restriction in effect 问题

    环境配置:centos 7 : php 7.1.5 Warning: require(): open_basedir restriction in effect. File(/home/wwwroot ...

  5. mysql 面安装配置

    解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我的解压目录是:    "D:\Program Files\MySQL\mysql-5.6.13-win32&quo ...

  6. DOM tiny-demo

    <script type="text/javascript" language="javascript">var i = 4; function a ...

  7. Java-转换原始类型为一个字符串

    package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...

  8. luogu3980 [NOI2008]志愿者招募

    神题,还不太清楚 #include <iostream> #include <cstring> #include <cstdio> #include <que ...

  9. windows和ubuntu14.04双系统设置默认启动项

    首先开机或者重启,在启动项选择菜单处记住win7对应的序号,从上至下的序号从0开始计数,我的win7系统选项处于第5个,那么序号就应该是4,记住后,打开ubuntu系统. 2 按下Ctrl+alt+T ...

  10. 树状数组 Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains

    C. Fountains time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...