Yii2学习笔记二十九:RBAC权限控制
下面介绍一个 yii2.0 的 Rbac 权限设置:
一、首先我们要在 组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main.php)。
'authManager' => [
'class' => 'yii\rbac\DbManager',
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
],
当然,在配置里面也可以设置 默认角色,只是我没写。Rbac 支持两种类,PhpManager 和 DbManager ,这里我使用 DbManager 。
yii migrate --migrationPath=@yii/rbac/migrations/
运行此命令生成权限数据表
二、 yii2.0 的 Rbac 权限数据表结构
yii2_auth_item 角色权限表,添加角色权限。
yii2_auth_item_child 角色权限关联表,给角色添加权限。
yii2_yii2_auth_rule 规则表,添加规则。
yii2_auth_assignment 用户角色表,给用户添加角色
yii2_user 用户表,创建用户
三、角色权限表增删改查,主要是操作yii2_auth_item数据表
/*
* 创建权限
* yii2_auth_item 角色权限表
*/
public function createPermission($item){
$auth=Yii::$app->authManager;
$createPost=$auth->createPermission($item);
$createPost->description='创建了'.$item.'许可';
if($auth->add($createPost)){
return true;
}else{
return false;
}
}
/**
* 删除“权限”
* 同时会删除auth_assignment、auth_item_child、auth_item中关于$role的内容
* @param string $role 角色名称
*/
public function deletePermission($item){
$role = Yii::$app->authManager->getPermission($item);
if (Yii::$app->authManager->remove($role)) {
return $this->redirect(['index']);
}else{
Yii::$app->session->setFlash('error','删除失败');
}
}
/**
* 更新“权限”
* 同时会删除auth_assignment、auth_item_child、auth_item中关于$role的内容
* @return bool
*/
public function updatePermission($item,$newItem){
$permission = Yii::$app->authManager->getPermission($item);
$permission->name=$newItem;
if (Yii::$app->authManager->update($item,$permission)) {
return true;
}else{
return false;
}
}
/*
* 创建角色
* yii2_auth_item 角色权限表
*/
public function createRole($item){
$auth=Yii::$app->authManager;
$role=$auth->createRole($item);
$role->description='创建了'.$item.'角色';
if($auth->add($role)){
return true;
}else{
return false;
}
}
/**
* ---------------------------------------
* 编辑“角色”
* 注意:角色表的“rule_name”字段必须为“NULL”,不然会出错。
* 详情见“yii\rbac\BaseManager”的203行if($item->ruleName === null){return true;}
* ---------------------------------------
*/
public function actionUpdate($role){
/* 获取角色信息 */
$model=$this->findModel($role);
//$item_name = Yii::$app->request->get('role');
$roled = Yii::$app->authManager->getRole($role);
if (Yii::$app->request->isPost) {
$data=Yii::$app->request->post();
$item=$data['AuthItemModel']['name'];
if($model->load($data)&&$model->validate()) {
$roled->name=$item;
$roled->description='创建了'.$item.'角色';
if (Yii::$app->authManager->update($role, $roled)) {
Yii::$app->session->setFlash('success', '更新成功');
} else {
Yii::$app->session->setFlash('error', '更新失败');
}
}
}
return $this->render('update',[
'model'=>$model
]);
}
/**
* 删除“角色”
* 同时会删除auth_assignment、auth_item_child、auth_item中关于$role的内容
* @param string $role 角色名称
*/
public function actionDelete($role){
$role = Yii::$app->authManager->getRole($role);
// print_r($role);exit;
if (Yii::$app->authManager->remove($role)) {
return $this->redirect(['index']);
}else{
Yii::$app->session->setFlash('error','删除失败');
}
}
四、角色权限关联表增删改查,主要是操作yii2_auth_item_child数据表
/*
* 给角色分配权限
* yii2_auth_item_child 角色权限关联表
*/
public function createEmpowerment($item1,$item2){
$auth=Yii::$app->authManager;
$parent=$auth->createRole($item1);
$child=$auth->createPermission($item2);
$auth->addChild($parent,$child);
}
/**
* ---------------------------------------
* 角色授权
* ---------------------------------------
*/
public function actionAuth($role){
//print_r(Yii::$app->authManager->getRolesByUser(Yii::$app->user->identity->id));exit;
if(Yii::$app->request->isPost){
$data=array_unique(Yii::$app->request->post());
/* 删除角色所有child */
$parent=Yii::$app->authManager->getRole($role);
Yii::$app->authManager->removeChildren($parent);
foreach($data as $k=>$v){
if($k!='_csrf-backend'){
$this->createEmpowerment($role,$v);
}
}
Yii::$app->session->setFlash('success', '添加成功');
//print_r($data);exit;
}
$menu=MenuModel::find()->asArray()->all();
$arr=TreeHelper::getTreeAsArray($menu,$pid=0);
$auth_permission=Yii::$app->authManager->getChildren($role);
return $this->render('auth',[
'menuArr'=>$arr,
'auth_permission'=>$auth_permission
]);
}
五、用户角色表增删改查,主要是操作yii2_auth_assignment数据表
/*
* 用户添加角色
* auth_assignment 用户角色表
*/
public function createAssign($item1,$item2){
$auth=Yii::$app->authManager;
$role=$auth->createRole($item1);
$auth->assign($role,$item2);
}
/**
* 用户角色更新
*/
public function actionUserRole($id){
if(Yii::$app->request->isPost){
$data=Yii::$app->request->post();
$item_name = $data['param'];
Yii::$app->authManager->revokeAll($id);
$this->createAssign($item_name,$id);
Yii::$app->session->setFlash('success', '更新成功');
}
$roles=Yii::$app->authManager->getRoles();
$group = array_keys(Yii::$app->authManager->getAssignments($id));
return $this->render('userrole',[
'roles'=>$roles,
'group' => $group,
'id'=>$id
]);
}
/**
* 用户角色删除
*/
public function actionUserRoleDelete($id,$role){
$role_item=Yii::$app->authManager->getRole($role);
if(Yii::$app->authManager->revoke($role_item,$id)){
return $this->redirect(['auth/index']);
}else{
Yii::$app->session->setFlash('error','删除失败');
return $this->render('user');
}
}
6、控制器中验证权限
public function beforeAction($action)
{
$action = Yii::$app->controller->action->id;
if(\Yii::$app->user->can($action)){
return true;
}else{
throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
}
}
public function beforeAction($action)
{
if (!Yii::$app->user->isGuest) {
$name=Yii::$app->authManager->getRolesByUser(Yii::$app->user->identity->id);
$bool=false;
foreach($name as $k=>$v){
$roleName=$k;
$parent=Yii::$app->authManager->getRole($roleName);
$action = Yii::$app->controller->action->id;
$controller=Yii::$app->controller->id;
$item2=$controller.'/'.$action;
$child=Yii::$app->authManager->createPermission($item2);
if(Yii::$app->authManager->hasChild($parent,$child)){
$bool=true;
}
}
if(!$bool){
throw new \yii\web\UnauthorizedHttpException('您现在还没获此操作的权限');
}else{
return true;
}
// if(\Yii::$app->user->can($action)){
// return true;
// }else{
// throw new \yii\web\UnauthorizedHttpException('您现在还没获此操作的权限');
// }
}else{
Yii::$app->user->loginRequired();
}
}
上一篇:wamp怎么配置虚拟主机
下一篇:npm命令
文章
总共 0 条评论