基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问),的有前景的代替受到广泛的控制。
这里我使用的是高级版的Yii框架,首先在common文件夹中config文件夹中的main-local.php中加入这段:
'authManager' => [ 'class' => 'yii\rbac\DbManager', 'itemTable' => 'auth_item', 'assignmentTable' => 'auth_assignment', 'itemChildTable' => 'auth_item_child', ],
Rbac支持两种类,PhpManager和DbManager,这里我使用的是DbManager,是对数据库进行的操作,使用PhpManager操作需要在backend文件夹中创建rbac文件夹创建items.php进行操作。
框架中只需要进入Cmd到框架根目录输入:yii migrate(运行这个命令,生成user表),
yii migrate - -migrationPath=@yii/rbac/migrations/ (运行此命令生成权限数据表)
下面这个控制器的几个动作方法,完成典型的CURD操作:
准备一:
<?php
use Yii; use yii\web\Controller; use yii\filters\VerbFilter; use yii\filters\AccessControl; class PostController extends Controller { public function actionAdd() { return $this->renderContent('添加'); } public function actionDelete() { return $this->renderContent('删除'); } public function actionUpdate() { return $this->renderContent('更新'); } public function actionSelect() { return $this->renderContent('查询'); }}
准备二:
创建几个用户,便于分配不同的角色,进行访问权限测试,采用yii框架生成的user表结构,创建用户可以在yii框架?r=site/signup中创建,注册成功后在?r=site/login
中去登录。
管理角色
/** * 添加角色 */ public function actionAdd_role() { // 获取authMananger组件对象 $auth = \Yii::$app->authManager; // 增加3个角色 $goods = $auth->createRole('商品管理员'); $auth->add($goods); $brand = $auth->createRole('品牌管理员'); $auth->add($brand); $sku = $auth->createRole('SKU管理员'); $auth->add($sku); //$auth->remove($goods);//这个是删除角色 }执行后会自动添加到数据库中的auth_item表中
![]()
为用户赋予角色
/** * 给用户赋角色 */ public function actionAdd_user_role() { // 获取authMananger组件对象 $auth = \Yii::$app->authManager; $goods = $auth->createRole('商品管理员'); $brand = $auth->createRole('品牌管理员'); $sku = $auth->createRole('SKU管理员'); //第一个参数角色,第二个参数为用户ID $auth->assign($sku, 1); $auth->assign($goods, 1); $auth->assign($brand, 1); }执行后会在auth_assignment表中生成如下数据:
![]()
增加权限
执行这个会在数据库中的auth_item表中生成权限:$add = $auth->createPermission('Add');//方法名 $add->description = '添加操作';//方法名称 $auth->add($add);//添加 $update = $auth->createPermission('Update'); $update->description = '修改操作'; $auth->add($update); $select = $auth->createPermission('Select'); $select->description = '查询操作'; $auth->add($select); $delete = $auth->createPermission('Delete'); $delete->description = '删除操作'; $auth->add($delete);为角色赋予权限
$auth = Yii::$app->authManager;$auth->addChild($goodsMan,$add);//商品管理员 添加权限 $auth->addChild($goodsMan,$delete);//商品管理员 删除 $auth->addChild($brandMan,$select);//品牌管理员 查询 $auth->addChild($brandMan,$update);//品牌管理员 修改这个添加会在数据库中的auth_item_child表生成以下这个方法实现的是在执行方法之前运行此方法,在if判断中国需要把获取到的方法首字母转换为大写:
public function beforeAction($action) { $user = Yii::$app->user; if (!$user->can(ucfirst($action->id))) { echo "您暂时没有访问该方法的权限";exit(); } return true; }