基于角色的权限访问控制(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表中生成如下数据:
增加权限
$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_item表中生成权限:
为角色赋予权限
$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;
}