管理平台 > 权限管理 > 授权管理
开发环境:
homestead: Ubuntu + Nginx + PHP7 + Mysql
Yii: yii2-app-advanced
本人使用的是 yii2-app-advanced
版本来进行开发,如果使用 yii2-app-basic
,请修改相应的命名空间。
由于本人表单使用原生 html
,所以在书写的时候要格外注意 csrf
的设置,不然的话,表单将无法提交成功。
首先关于 RBAC
的使用方式请参考本人另外一篇文章 Yii2 使用 RBAC
实现的 action
- user // 角色下所有的用户
- addUser // 给角色组添加用户
- removeUser // 从角色组删除用户
- 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 |
|
角色添加用户
我这里实现的是一次将多个用户添加到角色,方便管理
首先是讲角色的所有用户删除,再将信息接收到的用户写入到数据库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 |
|
角色删除用户
将角色中的用户删除,调用 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 |
|
这样整个权限管理就结束了。
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
End