管理平台 > 权限管理 > 角色 role
管理
开发环境:
homestead: Ubuntu + Nginx + PHP7 + Mysql
Yii: yii2-app-advanced
本人使用的是 yii2-app-advanced
版本来进行开发,如果使用 yii2-app-basic
,请修改相应的命名空间。
由于本人表单使用原生 html
,所以在书写的时候要格外注意 csrf
的设置,不然的话,表单将无法提交成功。
首先关于 RBAC
的使用方式请参考本人另外一篇文章 Yii2 使用 RBAC
创建控制器
建立 RoleController
控制器来管理角色
1 |
|
角色列表
获取全部角色,展示成列表,调用 vendor/yiisoft/yii2/rbac/BaseManager.php
文件中 getRoles
方法获取1
2
3
4
5
6
7# 控制器方法
public function actionIndex()
{
$auth = Yii::$app->getAuthManager();
$data = $auth->getRoles();
return $this->render('index', ['data' => $data]);
}
1 |
|
创建角色
实现表单展示和 POST 方法创建新的角色,首先用 createRole
方法创建一个 Role
对象,再调用 vendor/yiisoft/yii2/rbac/BaseManager.php
文件中 add
方法将角色入库1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public function actionCreate()
{
$request = Yii::$app->getRequest();
if ($request->isPost) {
$auth = Yii::$app->authManager;
$name = $request->post('name', '');
if ($name) {
try {
$role = $auth->createRole($name);
$role->description = $request->post('description', '');
$auth->add($role); // 新增角色方法,此方法和新增权限用的方法一样,主要是传的参数不一样
return $this->redirect(['role/index']);
} catch (\Exception $e) {
$error = $e->getMessage();
}
} else {
$error = '请填写角色名称';
}
}
return $this->render('create', ['error' => $error]);
}
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# 控制方法
public function actionChild()
{
$name = Yii::$app->getRequest()->get('name', '');
$auth = Yii::$app->authManager;
$role = $roleList = null;
if ($name) {
$role = $auth->getRole($name);
if (Yii::$app->getRequest()->getIsPost()) {
// 删除全部已有的子角色
$sql = "delete from auth_item_child where parent='{$name}' and child in (select name from auth_item where type=1)";
Yii::$app->db->createCommand($sql)->execute();
// 将新的写入到库中
$child = Yii::$app->getRequest()->post('child', []);
foreach ($child as $key => $value) {
$node = $auth->getRole($value);
$auth->addChild($role, $node);
}
return $this->redirect(['role/index']);
}
$roleList = $auth->getRoles();
$child = $auth->getChildRoles($name);
$child = $child ? array_keys($child) : [];
}
return $this->render('child', ['role' => $role, 'roleList' => $roleList, 'child' => $child]);
}
1 |
|
角色编辑
展示表单和 POST 方式实现角色更新,调用 vendor/yiisoft/yii2/rbac/BaseManager.php
文件中 update
方法更新
从这里看到调用的方法和权限节点更新是一样的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public function actionUpdate()
{
$name = Yii::$app->getRequest()->get('name', '');
$auth = Yii::$app->authManager;
$role = $auth->getRole($name);
$error = '';
if (Yii::$app->getRequest()->getIsPost()) {
$newName = Yii::$app->getRequest()->post('new_name', '');
$role->name = $newName;
$role->description = Yii::$app->getRequest()->post('description', '');
try {
$auth->update($name, $role);
return $this->redirect(['role/index']);
} catch (\Exception $e) {
$error = $e->getMessage();
}
}
return $this->render('update', ['model' => $role, 'error' => $error]);
}
1 |
|
角色删除
调用 vendor/yiisoft/yii2/rbac/BaseManager.php
文件中 revoke
方法进行删除1
2
3
4
5
6
7
8
9
10public function actionDelete()
{
$name = Yii::$app->getRequest()->get('name', '');
$auth = Yii::$app->authManager;
$role = $auth->getRole($name); // 获取角色
if ($auth->remove($role)) { // 传入角色信息,进行删除操作
return $this->redirect(['role/index']);
}
die('删除失败');
}
这样角色管理就结束了,下一节我将写授权管理。
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
End