RBAC 角色管理,为角色分配权限 [ 1.0 版本 ]
1. 控制器
<?php
namespace backend\controllers;
use common\models\RoleForm;
use yii\base\Exception;
use yii\helpers\ArrayHelper;
class RoleController extends BaseController{
public function actionIndex(){
$authManager = \Yii::$app->authManager;
$roles = $authManager->getRoles();
return $this->render('index',[
'roles'=>$roles,
]);
}
public function actionCreate(){
$model = new RoleForm();
if($model->load(\Yii::$app->request->post()) && $model->save()){
\Yii::$app->session->setFlash('success','角色['.$model->name.']添加成功');
return $this->redirect(['/role/index']);
}else{
return $this->render('create',[
'model'=>$model,
]);
}
}
public function actionUpdate($name){
$authManager = \Yii::$app->authManager;
$child = $authManager->getChildren($name);
if($child){
\Yii::$app->session->setFlash('success','角色['.$name.']有用户,不能修改');
return $this->redirect(['/role/index']);
}
$role = $authManager->getRole($name);
if(!$role) return false;
$model = new RoleForm();
$model->name = $role->name;
$model->description = $role->description;
if($model->load(\Yii::$app->request->post()) && $model->update($name)){
\Yii::$app->session->setFlash('success','角色['.$name.']修改成功');
return $this->redirect(['/role/index']);
}else{
return $this->render('update',[
'model'=>$model,
]);
}
}
public function actionDelete($name){
$authManager = \Yii::$app->authManager;
$child = $authManager->getChildren($name);
if($child){
\Yii::$app->session->setFlash('success','节点['.$name.']有子节点,不能删除');
return $this->redirect(['/node/index']);
}
$role = $authManager->getRole($name);
if(!$role) return false;
if($authManager->remove($role)){
\Yii::$app->session->setFlash('success','节点['.$name.']删除成功');
}else{
\Yii::$app->session->setFlash('error','节点['.$name.']删除失败');
}
return $this->redirect(['/role/index']);
}
public function actionNode($name){
$authManager = \Yii::$app->authManager;
$role = $authManager->getRole($name);
if(!$role){
throw new Exception('节点未找到');
}
if(\Yii::$app->request->isPost){
$nodes = \Yii::$app->request->post('node');
$authManager->removeChildren($role);
foreach($nodes as $v){
$node = $authManager->getPermission($v);
if(!$node)continue;
$authManager->addChild($role,$node);
}
return $this->redirect(['/role/index']);
}
$roleNodes = $authManager->getPermissionsByRole($name);
$roleNodes = array_keys($roleNodes);
$nodes = $authManager->getPermissions();
return $this->render('node',[
'nodes'=>$nodes,
'roleNodes'=>$roleNodes,
'name'=>$name,
]);
}
}
2. 视图
2.1. index.php
<?php
use yii\helpers\Html;
use yii\grid\GridView;
$this->title = '角色';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="node-index">
<p>
<?= Html::a('新建角色', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<table class="table table-striped">
<thead>
<tr>
<th>角色名称</th>
<th>角色描述</th>
<th>操 作</th>
</tr>
</thead>
<tbody>
<?php foreach($roles as $v){?>
<tr>
<td><?= $v->name?></td>
<td><?= $v->description?></td>
<td style="width: 140px;">
<?= Html::a('修改',['/role/update','name'=>$v->name])?>
<?= Html::a('权限',['/role/node','name'=>$v->name])?>
<?= Html::a('删除',['/role/delete','name'=>$v->name],[
'data' => [
'confirm' => '确认删除吗?',
'method' => 'post',
]
])?>
</td>
</tr>
<?php }?>
</tbody>
</table>
</div>
2.2. create.php
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
$this->title = '创建角色';
$this->params['breadcrumbs'][] = ['label'=>'角色','url'=>['/role/index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="row">
<?php $form=ActiveForm::begin()?>
<div class="col-md-6">
<?= $form->field($model,'name')->textInput(['maxlength'=>true])->hint('角色名称由小写字母开头,3-20位字符(a-z-_)组成')?>
</div>
<div class="col-md-8">
<?= $form->field($model,'description')->textarea(['rows'=>3])?>
</div>
<div class="col-md-8">
<?=Html::submitButton((Yii::$app->controller->action->id == 'create')?'新建':'更新',['class'=>'btn btn-primary'])?>
</div>
<?php ActiveForm::end()?>
</div>
2.3. update.php
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
$this->title = '更新角色';
$this->params['breadcrumbs'][] = ['label'=>'节点','url'=>['/node/index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="row">
<?php $form=ActiveForm::begin()?>
<div class="col-md-6">
<?= $form->field($model,'name')->textInput(['maxlength'=>true,'value'=>$model->name])->hint('角色名称由小写字母开头,3-20位字符(a-z-_)组成')?>
</div>
<div class="col-md-8">
<?= $form->field($model,'description')->textarea(['rows'=>3,'value'=>$model->description])?>
</div>
<div class="col-md-8">
<?=Html::submitButton((Yii::$app->controller->action->id == 'create')?'新建':'更新',['class'=>'btn btn-primary'])?>
</div>
<?php ActiveForm::end()?>
</div>
2.4. node.php
<?php
use yii\helpers\Html;
$this->title = '权限';
$this->params['breadcrumbs'][] = ['label'=>'角色','url'=>['/role/index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="node-index col-md-6">
<?= Html::beginForm(['/role/node','name'=>$name],'post')?>
<table class="table table-striped">
<thead>
<tr>
<th><?= Html::checkbox('check',false,['id'=>'check_all'])?></th>
<th>权限名称</th>
<th>标书</th>
</tr>
</thead>
<tbody>
<?php foreach($nodes as $v){?>
<tr>
<td><?= Html::checkbox('node[]',in_array($v->name,$roleNodes)?true:false,['value'=>$v->name,'class'=>'node_check'])?></td>
<td><?= $v->name?></td>
<td><?= $v->description?></td>
</tr>
<?php }?>
</tbody>
</table>
<div>
<?= Html::submitButton('提交',['class'=>'btn btn-primary'])?>
</div>
<?= Html::endForm()?>
</div>
<?php
$this->registerJs(
<<<ENT
$('#check_all').click(function(){
if($(this).is(':checked')){
$('.node_check').attr('checked',true);
}else{
$('.node_check').attr('checked',false);
}
});
ENT
);
?>
- 模型
<?php
namespace common\models;
use Yii;
use yii\base\Model;
use yii\helpers\Html;
class RoleForm extends Model
{
public $name;
public $description;
public function rules(){
return [
[['name'],'string','max'=>20],
[['name','description'],'required'],
['name','match','pattern'=>'/^[a-z][a-z-_]{2,20}$/','message'=>'name属性不合法'],
['description','filter','filter'=>function($value){
return Html::encode($value);
}],
];
}
public function attributeLabels(){
return [
'name'=>'角色名称',
'description'=>'角色描述',
];
}
public function save(){
if($this->validate()){
$authManager = Yii::$app->authManager;
$role = $authManager->createRole($this->name);
$role->description = $this->description;
$authManager->add($role);
return true;
}else{
return false;
}
}
public function update($name){
if($this->validate()){
$authManager = Yii::$app->authManager;
$role = $authManager->getRole($name);
if(!$role) return false;
$authManager->remove($role);
$role = $authManager->createRole($this->name);
$role->description = $this->description;
$authManager->add($role);
return true;
}
return false;
}
}
specialnot
注册时间:2015-08-06
最后登录:2019-08-16
在线时长:27小时54分
最后登录:2019-08-16
在线时长:27小时54分
- 粉丝43
- 金钱1175
- 威望200
- 积分3445
共 1 条评论
这个不是2.0的版本吗