`
hudeyong926
  • 浏览: 2032899 次
  • 来自: 武汉
社区版块
存档分类
最新评论

YII RBAC

 
阅读更多

YII非rbac通用权限,controller中加权限过滤器beforeaction

public function purview($module, $control, $action) {
    if (!$this->checkPower($action, $control, module)) {
        throw new CHttpException(403, '您没有访问权限!');
        Yii::app()->end();
    }
}

// CGRIDVIEW buttonID 'visible' =>'$this->grid->controller->checkPower("delete")',
public function checkPower($action, $contrl = null, $module = null) {
    if ($contrl === null) {
        $contrl = $this->getId();
    }

    if ($module === null && $this->getModule()) {
        $module = $this->getModule()->getId();
    }

    return Privilege::model()->checkPower($module, $contrl, $action);
}
public function beforeAction($action) {
    $contrl = $this->getId();
    $actionId = $action->getId();
    $route = $contrl . '/' . $actionId;
    if (!in_array($route, array('site/login', 'site/error', 'site/logout')) && Yii::app()->user->id != 1) {
        $module = null;
        if ($action && $this->getModule()) {
            $module = $this->getModule()->getId();
        }
        $this->purview($module, $contrl, $actionId);
    }
    return parent::beforeAction($action);
}

在这里的visible表达式中设置调用$this->checkPower('操作名');就可以隐藏没有权限访问的菜单了

 

RBAC0 定义了能构成一个RBAC控制系统的最小的元素集合
在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。
RBAC1 引入角色间的继承关系
角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。
RBAC2 模型中添加了责任分离关系
RBAC2 的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。
RBAC3 包含了RBAC1和RBAC2

 

YII提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,两者之间,前者先于后者。即访问的控制判断机制有个先后顺序:先进行访问控制过滤器的判断,再进行角色访问控制判断。而RBAC和默认的按照users的原理一样。通过指定”roles”来限定对应角色用户的可用action的权限。用”roles”替 换”users”即可,因为Yii的accessControl是支持roles的。通过这种方式,在Contoller内部,通过指定 accessRules就可以控制权限。在其他地方,比如控制一些view的显示的时候,可以用 Yii::app()->user->checkAccess(role)来进行权限判断。
RBAC本身也有特别之处。看官方的一段原话:
在Yii的RBAC的一个基本概念是authorization item(授权项目)。一个授权项目是一个做某事的许可(如创造新的博客发布,管理用户)。根据其粒度和targeted audience, 授权项目可分为operations(行动),tasks(任务)和 roles(角色)。角色包括任务,任务包括行动,行动是许可是个原子。 例如,我们就可以有一个administrator角色,包括post management和user management任务。user management 任务可能包括create user,update user和delete user行动。为了更灵活,Yii也可以允许角色包括其他角色和动作,任务包括其他任务,行动包括其他行动。
也就是说在Yii::app()->user->checkAccess(role)的时候,role可以是operations,tasks和roles。

rights,srbac可视化配置,自动安装表 http://www.yiiframework.com/extension/srbac/但是一定要弄懂Yii的内部 rbac 因为这扩展个都是建立在这个基础上的.


开始准备
Yii提供了强大的配置机制和很多现成的类库。在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码。所以准备工作就是,打开编辑器,跟我来。 设置参数、建立数据库
在配置数组中,增加以下内容:

srbac 

'components' => array(
    'authManager' => array(
        'class' => 'srbac.components.SDbAuthManager',
        'connectionID' => 'db', //使用的数据库组
        'itemTable' => 'tbl_items', // 授权项目表 (默认:authitem)
        'assignmentTable' => 'tbl_assignments', // 授权分配表 (默认:authassignment)
        'itemChildTable' => 'tbl_itemchildren', // 授权子项目表 (默认:authitemchild)
    ),
),

注意这里,'class'=>'srbac.components.SDbAuthManager', 手册上写的错了

那这三个数据表怎么建立呢?很简单,去看framework/web/auth/schema.sql。注意要和你的自定义的表名称对应起来。然后在数据库中运行这个SQL文件中的语句。

修改对应的配置

'modules' => array(
    'srbac' => array(
        'userclass' => 'Member', //default: User
        'userid' => 'mid', //default: userid
        'username' => 'username', //default:username
****

index.php?r=srbac,安装成功可以删除modules\srbac\views\authitem\install文件夹也可以重命名。然后找到protected\modules\srbac\controllers\AuthitemController.php注释掉beforeAction方法中代码。

if (!$this->module->isInstalled() && $action->id != "install") {
  $this->redirect(array("install"));
  return false;
}

 rights有4个表在data下

'import' => array(
    // rights
    'application.modules.rights.*',
    'application.modules.rights.models.*',
    'application.modules.rights.components.*', // Correct paths if necessary.
),

'modules' => array(
    'rights' => array(
        //'debug' => true,
        'install' => true,
        //'enableBizRuleData' => true,
    ),
),
'components' => array(
    'authManager' => array(
        'class' => 'RDbAuthManager',
        'connectionID' => 'db',
        'itemTable' => 'r_auth_item',
        'itemChildTable' => 'r_auth_item_child',
        'assignmentTable' => 'r_auth_assignment',
        'rightsTable' => 'r_rights',
    ),
    'user' => array(
        'class' => 'RWebUser',
    ),
)

rights

class Controller extends RController {
    public function filters() {
        return array(
            'rights',
        );
    }
}
进行赋权

我们建立了RBAC权限管理,就需要进行对权限的WEB管理。这些就需要你自己写代码了。
根据不同种类的项目调用下列方法之一定义授权项目

    * CAuthManager::createRole
    * CAuthManager::createTask
    * CAuthManager::createOperation

一旦我们拥有一套授权项目,我们可以调用以下方法建立授权项目关系:
    * CAuthManager::addItemChild
    * CAuthManager::removeItemChild
    * CAuthItem::addChild
    * CAuthItem::removeChild

最后,我们调用下列方法来分配角色项目给各个用户:
    * CAuthManager::assign
    * CAuthManager::revoke

权限数据的添加 项目调用定义授权项目后会在table中插入相应的数据

2.

<?php
class RbacController extends CController{
/** @method 动作过滤器 */
public function filters() {
    return array(
        'checkLogin - login,logout', //-号是除了login,logou之外的动作全部要执行checkLogin 这个验证
        'checkRole - login,logout,index', //如果是+号是,只执行login,logou的动作才会执行checkLogin 这个验证
        'checkModifyPwd - login,logout,modifypwd'
    );
}	
public function accessRules()
{
	return array(
		array(
			'allow',
			'actions' => array('deletePost'),
			'roles' => array('deletePost'),
		),
		array(
			'allow',
			'actions' => array('init', 'test'),
		),
		array('deny'),
	);
}
public function actionInit()
{
	$auth=Yii::app()->authManager;
	$auth->createOperation('createPost','create a post');
	$auth->createOperation('readPost','read a post');
	$auth->createOperation('updatePost','update a post');
	$auth->createOperation('deletePost','delete a post');
	$bizRule='return Yii::app()->user->id==$params["post"]->authID;';
	$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);
	$task->addChild('updatePost');
	$role=$auth->createRole('reader');
	$role->addChild('readPost');
	$role=$auth->createRole('author');
	$role->addChild('reader');
	$role->addChild('createPost');
	$role->addChild('updateOwnPost');
	$role=$auth->createRole('editor');
	$role->addChild('reader');
	$role->addChild('updatePost');
	$role=$auth->createRole('admin');
	$role->addChild('editor');
	$role->addChild('author');
	$role->addChild('deletePost');
	$auth->assign('reader','readerA');
	$auth->assign('author','authorB');
	$auth->assign('editor','editorC');
	$auth->assign('admin','adminD');
	echo "Done.";
}
public function actionDeletePost()
{
	echo "Post deleted.";
}
public function actionTest()
{
	$post = new stdClass();
	$post->authID = 'authorB';
	echo "Current permissions:<br />";
	echo "<ul>";
	echo "<li>Create post: ".Yii::app()->user->checkAccess('createPost')."</li>";
	echo "<li>Read post: ".Yii::app()->user->checkAccess('readPost')."</li>";
	echo "<li>Update post: ".Yii::app()->user->checkAccess('updatePost', array('post' => $post))."</li>";
	echo "<li>Delete post: ".Yii::app()->user->checkAccess('deletePost')."</li>";
	echo "</ul>";
}

}

 UserIdentity.php

$users=array(
	// username => password
	'demo'=>'demo',
	'admin'=>'admin',
	'readerA'=>'123',
	'authorB'=>'123',
	'editorC'=>'123',
	'adminD'=>'123',			
);

 运行?r=Rbac/init插入rbac数据,在用readerA,authorB,editorC...登录后访问?r=Rbac/test查看对应的权限检查页面

 

权限检查
假设你在你的管理界面进行了赋权,那么可以在程序里面进行权限检查:

$project = Project::model()->findByPk($row1['project_id']);
$auth = Yii::app()->authManager;
$bizRule = 'return isset($params["project"]) &&$params["project"]->isUserInRole("member");';
$auth->assign('member', $row1['user_id'], $bizRule);
$params = array('project' => $project);
if (Yii::app()->user->checkAccess('updateIssue', $params)) {
    // 这里可以显示表单等操作
} else {
    // 检查没有通过的可以跳转或者显示警告
}

上面的代码就检查了用户是否可以执行“updateIssue”,这updateIssue可能是一个任务,也可以是一个行动。

控制action方式
public function filters()
{
    return array(
        'accessControl', // perform access control for CRUD operations
        'postOnly + delete', //actiondelete方法只能用POST方式提交。
        'ajaxOnly tree',//actionTree方法只能用ajax方式提交。
    );
}
 dxxx

 

分享到:
评论
1 楼 coly 2013-01-04  

相关推荐

    Yii Rbac 资源包

    Yii 框架中的 Role-Based Access Control(RBAC)是一种强大的权限管理机制,它允许开发者在应用程序中精细地控制用户访问权限。这个“Yii Rbac 资源包”包含了数据库脚本、代码示例和其他相关文件,旨在帮助开发者...

    yii Rbac 实践详解

    学习yii Rbac自己总结的经验!因为找过相关资料,很头疼,所以自己总结出来,共大家分享!!

    yii2 rbac yii2 rest RBAC Auth manager for-yii2-rest-rbac.zip

    标题 "yii2 rbac yii2 rest RBAC Auth manager for-yii2-rest-rbac.zip" 提到的主要是关于在 Yii2 框架下,针对 RESTful API 的 RBAC 管理器的实现。这个压缩包很可能包含了一个预配置的 RBAC 解决方案,用于帮助...

    yii2 rbac yii2 rest RBAC Auth manager for-yii-rest-admin.zip

    标题 "yii2 rbac yii2 rest RBAC Auth manager for-yii-rest-admin" 暗示了这是一个关于在 Yii2 中实现 RESTful API 的 RBAC 管理器,特别是为 "yii-rest-admin" 这个项目设计的。这个压缩包可能包含了实现这一功能...

    yii框架 rbac扩展

    RBAC(Role-Based Access Control,基于角色的访问控制)是 Yii 框架中一个重要的权限管理组件,用于实现复杂的权限分配和访问控制。在Yii框架1.1版本中,RBAC扩展提供了一套完善的机制,允许开发者轻松管理用户的...

    Yii 添加Srbac模块安装配置详细教程

    在工作中整理出的yii RBAC中Srbac的详细安装步骤,附截图。

    yii2-rbac-cached:为 yii2 RBAC 缓存

    yii2-rbac-缓存 为 yii2 RBAC 缓存 安装 安装此扩展的首选方法是通过 。 要么跑 php composer.phar require "letyii/yii2-rbac-cached" "dev-master" 或添加 " letyii/yii2-rbac-cached " : " dev-master " 到...

    Yii2 RBAC 集成了用户管理模块和自写的权限管理模块,前端页面采用H+框架。-Yii2-Rbac.zip

    2. **Yii2 的RBAC组件**:Yii2内置了`yii\rbac\DbManager`,它使用数据库来存储RBAC数据。这个组件允许动态地创建、分配和管理角色、任务和权限。 3. **创建RBAC结构**:使用`yii\rbac\ManagerInterface`提供的方法...

    基于Yii2+layui的后台框架模板,实现了完善的RBAC权限控制-yii2-admin-theme.zip

    在Yii2中,RBAC可以通过yii\rbac组件来实现。这个组件支持创建角色、任务、规则,并将它们关联起来。用户可以被分配到角色,角色则拥有特定的权限。Yii2的RBAC系统允许动态调整权限,比如在运行时添加或删除用户的...

    Yii2 rbac权限控制之rule教程详解

    Yii2 RBAC,即基于角色的访问控制(Role-Based Access Control),是Yii2框架中用于实现权限管理的一种机制。通过RBAC,可以简化复杂权限系统的构建过程,使得权限管理更加直观和易于管理。 在Yii2的RBAC权限控制中...

    yii2-rbac-migration:用于 RBAC 迁移的 Yii2 扩展

    用于 RBAC 迁移的 Yii 2 扩展 安装 在composer.json添加: { "require": { "rmrevin/yii2-rbac-migration": "1.1.*" } } 用法 创建新的迁移扩展 \rmrevin\yii\rbac\RbacMigration 并作为正常迁移执行 &lt;? //...

    yii-rest-admin:yii2 rbac yii2 rest RBAC Auth manager for Yii2 RESTful(YII2权限管理rbac--rest接口方式)

    Yii-rest-rbac 后台RBAC配置写在前面本篇只讲述如何使用Yii-rest-rbac进行 restful API认证和权限管理,关于原理,请移步(目前未完成)下载安装 composer require clement/yii-rest-rbacor ...rbac 创建数据表使用@...

    yii-rbac:yii框架rbac权限管理

    yii-rbac yii框架rbac权限管理 1.basic_admin_user 表中手动建立一个系统管理员账户,id为1(必需为1)。 2.登录用户时把用户的id存到$_SESSION['admin_uid']中。 3.后台登陆链接 账号:admin 密码:admin 4.在rbac/...

    Yii2 rbac权限控制操作步骤实例教程

    Yii2框架的RBAC(Role-Based Access Control)权限控制系统是一种强大的访问控制机制,它允许开发者定义角色、权限和任务,以便更精细地管理用户访问权限。本文将详细讲解如何在Yii2中进行RBAC的权限控制操作步骤。 ...

    浅析Yii中使用RBAC的完全指南(用户角色权限控制)

    在Yii框架中实现RBAC功能,首先需要设置RBAC相关的配置参数,并建立相应的数据库表结构。Yii使用CDbAuthManager作为认证管理器,它依赖于三个数据表来存储权限信息:授权项表(pre_auth_item)、授权项父子关系表...

    Yii2-Rbac:Yii2 RBAC 集成了用户管理模块和自写的权限管理模块,前端页面采用H+框架

    Yii2+Yii2 RBAC 集成了用户管理模块和自写的权限管理模块,前端页面采用H+框架。#安装使用Git clone到本地后,新建数据库,将yii2advanced.sql文件导入数据库,修改common/config/main-local.php 配置文件数据库信息...

    内置有Rbac权限的YII2框架源码

    1. **安装和配置**:首先,你需要在项目中安装`yii2-rbac`扩展,通过Composer执行`composer require yiisoft/yii2-rbac`。然后,在配置文件中启用Rbac组件,如`config/web.php`中的`'components' =&gt; ['authManager' ...

    Yii2 rbac权限控制之菜单menu实例教程

    以上便是Yii2 rbac权限控制之菜单menu实例教程所涉及的主要知识点,它不仅涉及了RBAC的基本概念和操作,还涉及了如何在实际的Web应用开发中将RBAC与菜单权限控制结合起来,实现安全的、权限分明的菜单显示逻辑。...

    yii2-cached-rbac-dbmanager:yii2 RBAC 的缓存 DBManager

    yii2 RBAC 的缓存 DBManager 允许缓存 yii\rbac\DbManager 中的权限警告Yii2 现在支持 yii\rbac\DbManager 的本地缓存。 见安装安装此扩展的首选方法是通过 。 要么跑 ...

    yii2-rbac-module:Yii2 RBAC 模块,从 RBAC 数据存储文件 rbac.php 生成对 DB 的分配

    Yii2 RBAC 模块 RBAC 模块,可从 RBAC 数据存储文件生成对 DB 的分配。 “经典”PhpManager 也可用。安装作曲家安装此扩展的首选方法是通过 。 要么跑 ...

Global site tag (gtag.js) - Google Analytics