Yii2 RBAC 授权管理(三)

管理平台 > 权限管理 > 授权管理

开发环境:
homestead: Ubuntu + Nginx + PHP7 + Mysql
Yii: yii2-app-advanced

本人使用的是 yii2-app-advanced 版本来进行开发,如果使用 yii2-app-basic,请修改相应的命名空间。
由于本人表单使用原生 html,所以在书写的时候要格外注意 csrf 的设置,不然的话,表单将无法提交成功。

首先关于 RBAC 的使用方式请参考本人另外一篇文章 Yii2 使用 RBAC

实现的 action

  1. user // 角色下所有的用户
  2. addUser // 给角色组添加用户
  3. removeUser // 从角色组删除用户
  4. permission // 角色对应权限管理

创建控制器

由于这次许多方法都是针对用户组操作的,所以这次的方法全部放到 RoleController 这个控制器中,具体请阅读我上一篇文章 Yii2 RBAC 角色管理

查看角色全部用户

获取角色对应的全部用户,展示成列表,便于管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 控制器方法
public function actionUser()
{
$request = Yii::$app->getRequest();
$name = $request->get('name', '');
// 根据角色名获取对应用户列表,由于 RBAC 底层实现了根据用户组名获取用户 id 列表的方法
// 参考其 getUserIdsByRole 方法实现
$data = $this->getRoleUser($name);
return $this->render('user', ['data' => $data]);
}

protected function getRoleUser($name)
{
$query = new Query();
$data = $query
->select('a.*,u.id,u.username')
->from(['a' => 'auth_assignment', 'u' => 'user'])
->where("a.user_id=u.id and a.item_name='{$role}'")
->all();
return $data;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
# 模板 backend/views/role/user.php

use yii\helpers\Url;
$this->params['breadcrumbs'][] = [
'label' => 'Role',
'url' => Url::to(['role/index'])
];
$this->params['breadcrumbs'][] = 'Role User List';
?>

<div class="operate">
<a href="<?= Url::to(['role/add-user', 'name' => $role]) ?>" class="btn btn-success">Add User</a>
</div>

<table class="table table-bordered table-hover">
<thead>
<tr>
<th>ID</th>
<th>Username</th>
<th>Role</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<?php foreach ($data as $row): ?>
<tr>
<td><?= $row['id']; ?></td>
<td><?= $row['username']?></td>
<td><?= $row['item_name'] ?></td>
<td>
<a href="<?= Url::to(['role/delete-user', 'name' => $role, 'user_id' => $row['id']]); ?>"
class="glyphicon glyphicon-trash" title="delete"></a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>

角色添加用户

我这里实现的是一次将多个用户添加到角色,方便管理
首先是讲角色的所有用户删除,再将信息接收到的用户写入到数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 控制器方法
public function actionAddUser()
{
$request = Yii::$app->getRequest();
$name = $request->get('name', '');
$auth = Yii::$app->authManager;

if (!empty($name) && $request->getIsPost()) {
// 首先删除该角色的所有用户
$query = new Query();
$query->createCommand()->delete('auth_assignment', ['item_name' => $name])->execute();

// 其次将接收到的数组重新添加到权限组
$users = $request->post('users', []);
if ($users) {
$role = $auth->getRole($name);
foreach ($users as $row) {
$data[] = [
'user_id' => $row,
'item_name' => $name,
'created_at' => time()
];
}
// 采用 yii 自带插入多条数据的方法
$res = $query->createCommand()
->batchInsert('auth_assignment', ['user_id', 'item_name', 'created_at'], $data)
->execute();
if ($res) {
return $this->redirect(['role/user', 'name' => $name]);
}
$error = '添加失败';
}
} else {
$error = '参数错误&访问方式错误';
}

$roleUser = $auth->getUserIdsByRole($name); // 获取当前用户组已有用户 id 列表
$users = User::find()->all(); // 全部用户列表

return $this->render('add_user', [
'users' => $users,
'role' => $name,
'roleUser' => $roleUser,
'error' => $error
]);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
# 模板 backend/views/role/add_user.php

use yii\helpers\Html;
use yii\helpers\Url;

$this->params['breadcrumbs'][] = [
'label' => 'Role',
'url' => Url::to(['role/index'])
];
$this->params['breadcrumbs'][] = 'Add User';
?>

<form action="" method="post">
<?php foreach ($users as $row): ?>
<div class="checkbox">
<label>
<input type="checkbox"
"<?php if(in_array($row->id, $roleUser)) { echo 'checked'; } ?>"
value="<?= $row->id ?>"
name="users[]"><?=Html::encode($row->username); ?>
</label>
</div>
<?php endforeach; ?>

<input type="hidden" name="_csrf-backend" value="<?=Yii::$app->getRequest()->getCsrfToken(); ?>">
<button type="submit" class="btn btn-success">Submit</button>
</form>

角色删除用户

将角色中的用户删除,调用 vendor/yiisoft/yii2/rbac/DbManager.php 中的 revoke 方法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 控制器方法
public function actionDeleteUser()
{
$userId = Yii::$app->getRequest()->get('user_id', 0);
$name = Yii::$app->getRequest()->get('name', '');
if ($userId && $name) {
$auth = Yii::$app->authManager;
$role = $auth->getRole($name); // 获取角色信息
if ($role && $auth->revoke($role, $userId)) {
return $this->redirect(['role/user', 'name' => $name]);
} else {
die('角色不存在');
}
} else {
die('参数错误');
}
}

角色权限节点

管理角色对应权限节点,展示全部权限,并且将角色所属的权限节点选中。
POST 方法将重新给角色添加权限节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 控制器方法
public function actionPermission()
{
$request = Yii::$app->getRequest();
$name = $request->get('name', '');

if (!$name) {
die('参数错误');
}

$auth = Yii::$app->authManager;
$role = $auth->getRole($name);
if (!$role) {
die('角色不存在');
}

if ($request->getIsPost()) { // POST 方式访问的话,处理角色权限

// 处理角色绑定权限
$permissions = $request->post('permissions', []);
// 首先删除角色全部权限
$query = new Query();
$query->createCommand()->delete('auth_item_child', ['parent' => $name])->execute();
// 其次将权限数组全部绑定到角色
if ($permissions) {
foreach ($permissions as $row) {
$permission = $auth->getPermission($row);
$auth->addChild($role, $permission);
}
}
return $this->redirect(['role/index']);
}

$permissions = $auth->getPermissions(); // 获取权限列表
$rolePermissions = $auth->getPermissionsByRole($name); // 获取角色对应权限列表
return $this->render('permission', [
'permissions' => $permissions,
'rolePermissions' => array_keys($rolePermissions)
]);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
# 模板 backend/views/role/permission.php

use yii\helpers\Html;
use yii\helpers\Url;

$this->params['breadcrumbs'][] = [
'label' => 'Role',
'url' => Url::to(['role/index'])
];
$this->params['breadcrumbs'][] = 'Add Permisssion';
?>

<form action="" method="post">
<?php foreach ($permissions as $row): ?>
<label>
<input type="checkbox"
<?php if(in_array($row->name, $rolePermissions)) { echo 'checked'; } ?>
value="<?= $row->name ?>"
name="permissions[]"><?=Html::encode($row->description); ?>
</label><br/>
<?php endforeach; ?>

<div>
<input type="hidden" name="_csrf-backend" value="<?=Yii::$app->getRequest()->getCsrfToken(); ?>">
<button type="submit" class="btn btn-success">Submit</button>
</div>
</form>

这样整个权限管理就结束了。

©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息

End

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay