0.思想
角色与权限表父子关系表
角色与权限表描述表
角色与用户对应表
如果要能对任何⽤户进⾏权限检查,需要调⽤yii\rbac\ManagerInterface::checkAccess()⽅法就可以检查权限了。
1.启用RBAC
在common/main.php里面进行启用
// 配置权限组件
'authManager' => [
'class' =>'yii\rbac\DbManager',
],
2.步骤
2.1建立数据表
方法一:利用migration进行建立
yii migrate --migrationPath=@yii/rbac/migrations
方法二:利用sql进行建立
auth_assignment表示的是角色与用户id的关系
auth_item表示的是所有的角色与权限的表格(type为1Wie角色 为2则是权限)
auth_item_child表示的是角色与角色的父子关系 角色与权限的父子关系
auth_rule表示的是在权限之上的关系
2.2填充数据
用代码逻辑清晰 也可以直接在数据表格里面进行添加数据
<?php
use yii\db\Migration;
class m170124_084304_init_rbac extends Migration
{
public function up()
{
$auth = Yii::$app->authManager;
// 添加 "createPost" 权限
$createPost = $auth->createPermission('createPost');
$createPost->description = 'Create a post';
$auth->add($createPost);
// 添加 "updatePost" 权限
$updatePost = $auth->createPermission('updatePost');
$updatePost->description = 'Update post';
$auth->add($updatePost);
// 添加 "author" 角色并赋予 "createPost" 权限
$author = $auth->createRole('author');
$auth->add($author);
$auth->addChild($author, $createPost);
// 添加 "admin" 角色并赋予 "updatePost"
// 和 "author" 权限
$admin = $auth->createRole('admin');
$auth->add($admin);
$auth->addChild($admin, $updatePost);
$auth->addChild($admin, $author);
// 为用户指派角色。其中 1 和 2 是由 IdentityInterface::getId() 返回的id
// 通常在你的 User 模型中实现这个函数。
$auth->assign($author, 2);
$auth->assign($admin, 1);
}
public function down()
{
$auth = Yii::$app->authManager;
$auth->removeAll();
}
}
填充数据进行添加到数据表格中
yii rbac/init
3.分配角色
下面是利用代码进行分配的角色权限 也可以写一个页面进行分配权限角色
public function signup()
{
if ($this->validate()) {
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save(false);
// 增加了以下三行:
$auth = \Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());
return $user;
}
return null;
}
4.权限检查
if (\Yii::$app->user->can('createPost')) {
//
}
5.控制器
public function actionPrivilege($id)
{
if (!Yii::$app->user->can('gm', [], true)) {
throw new ForbiddenHttpException('对不起,你没有这个权限');
}
//step1. 找出所有权限,提供给checkboxlist 用于显示所有的权限
$allPrivileges = AuthItem::find()
->select(['name', 'description'])
->where(['type' => 1])
->orderBy('description')
->all();
foreach ($allPrivileges as $pri) {
$allPrivilegesArray[$pri->name] = $pri->description;
}
//step2. 当前用户的权限
$AuthAssignments = AuthAssignment::find()
->select(['item_name'])
->where(['user_id' => $id])
->orderBy('item_name')
->all();
//此处的数组是在把之前有的权限制作成了一个数组
$AuthAssignmentsArray = array();
foreach ($AuthAssignments as $AuthAssignment) {
array_push($AuthAssignmentsArray, $AuthAssignment->item_name);
}
//step3. 从表单提交的数据,来更新AuthAssignment表,从而用户的角色发生变化
if (isset($_POST['newPri'])) {
AuthAssignment::deleteAll('user_id=:id', [':id' => $id]);
$newPri = $_POST['newPri'];
$arrlength = count($newPri);
for ($x = 0; $x < $arrlength; $x++) {
$aPri = new AuthAssignment();
$aPri->item_name = $newPri[$x];
$aPri->user_id = $id;
$aPri->created_at = time();
$aPri->save();
}
return $this->redirect(['index']);
}
//step4. 渲染checkBoxList表单
return $this->render('privilege', ['id' => $id, 'AuthAssignmentArray' => $AuthAssignmentsArray,
'allPrivilegesArray' => $allPrivilegesArray]);
}
6.区分显示
前端页面可以利用php插入html代码进行显示不同的按钮页面
因为Yii::$app->user->can是全局性质的组件 可以进行检查!