1.首先我们要在配置文件的组件(component)里面配置一下 Rbac'authManager' => [
'class' => 'yii\rbac\DbManager',
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
],
2.生成rbac默认数据表
a.运行下面的命令生成权限数据表:
yii migrate --migrationPath=@yii/rbac/migrations/
b.也可以打开vendor\yiisoft\yii2\rbac\migrations\schema-mysql.sql 拷贝里面的内容到数据库运行生成数据表
3.添加角色和权限
a.创建权限public function createPermission($name)
{
$auth = Yii::$app->authManager;
$createPost = $auth->createPermission($name);
$createPost->description = '创建了 ' . $name. ' 权限';
$auth->add($createPost);
}
b.创建角色public function createRole($name)
{
$auth = Yii::$app->authManager;
$role = $auth->createRole($name);
$role->description = '创建了 ' . $name. ' 角色';
$auth->add($role);
}
以上两条添加,会创auth_item表中创建两条记录,以表中的type类型作为区分,type=1是角色,type=2为权限public function add($object)
{
if ($object instanceof Item) {
return $this->addItem($object);
} elseif ($object instanceof Rule) {
return $this->addRule($object);
} else {
throw new InvalidParamException("Adding unsupported object type.");
}
}
add方法会根据你传入的对象属性进行添加(添加角色和权限都是addItem,因为createPermission和createRole都创建了一个Item对象,只是对象中的type值不同)
4.添加用户、角色和权限之间的关系
a.将权限赋给角色public function addChild($items)
{
$auth = Yii::$app->authManager;
$parent = $auth->createRole($items['role']); //创建角色对象
$child = $auth->createPermission($items['permission']); //创建权限对象
$auth->addChild($parent, $child); //添加对应关系
}
注意:上面创建的角色和权限对象,必须已经在数据库中创建,比如items['role'] = test,否则会报错
b.将角色赋给用户public function addChild($items)
{
$auth = Yii::$app->authManager;
$role = $auth->createRole($items['role']); //创建角色对象
$user_id = 1; //获取用户id,此处假设用户id=1
$auth->assign($role, $user_id); //添加对应关系
}
5.验证权限public function beforeAction($action)
{
$action = Yii::$app->controller->action->id;
if(\Yii::$app->user->can($action)){
return true;
}else{
throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
}
}
看下\Yii::$app->user->can()这个方法public function can($permissionName, $params = [], $allowCaching = true)
{
if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
return $this->_access[$permissionName];
}
$access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
if ($allowCaching && empty($params)) {
$this->_access[$permissionName] = $access;
}
return $access;
}
以上为创建权限的思路,大家可以根据上面的思路,结合项目需求,灵活的运用rbac做一套权限管理系统
当然,为了更加清楚演示rbac的实例,酱油君亲身实践,为大家提供了自己的一套rbac的解决方案,请关注酱油的第三篇教程。