yii2 RBAC使用DbManager实现后台权限判断的方法


Posted in PHP onJuly 23, 2016

本文实例讲述了yii2 RBAC使用DbManager实现后台权限判断的方法。分享给大家供大家参考,具体如下:

首先根据文档生成yii2 框架中的表

yii migrate --migrationPath=@yii/rbac/migrations/

生成如下4表:

auth_assignment
auth_item_child
auth_item
auth_rule

使用yii的gii快速生成对应的model,但是由于auth_item表同时存储角色跟权限,由于后面我们要分角色跟权限来做curd操作,所以我这里新建了一个RoleForm和PermissionForm两个model来区分开角色与权限。由于角色跟权限紧紧相连,又在auth_item生成的model中多加一个属性$child,后面会用到现在先不管。

下面是角色model的相关代码

<?php
namespace app\models;
use Yii;
use app\models\AuthItem;
use yii\rbac\Item;
/*
 * 角色model
 * 指尖上的艺术家
 */
class RoleForm extends AuthItem
{
  public function init() {
    parent::init();
    $this->type = Item::TYPE_ROLE;//yii-rbac-Role隐藏继承常量这里的值是1
  }
}

下面是权限model的相关代码

<?php
namespace app\models;
use Yii;
use app\models\AuthItem;
use yii\rbac\Item;
/*
 * 权限model
 * 指尖上的艺术家
 */
class PermissionForm extends AuthItem
{
  public function init() {
    parent::init();
    $this->type = Item::TYPE_PERMISSION;//常量值 2
  }
}

另外在AuthItem模型中增加一个属性

<?php
class AuthItem.....
public $child;//用于角色权限添加
......

现在到我们对应的控制器了

首先我们说权限控制器写控制器的时候要用到系统自带的扩展
。。。
use yii\rbac\Permission;
。。。

/*
 * 权限添加
 */
public function actionCreate() {
  $model = new PermissionForm();
  if( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
    //rbac中permission对象
    $permission = new Permission();
    $permission->name = trim( $model->name );
    $permission->type = $model->type;
    //权限添加
    Yii::$app->authManager->add( $permission );
  }
}

修改的时候 其他的不变就是换了个方法

/*
 * param string $name 修改的权限名
 * param Object $permission 跟添加一样提交上来的数据
 */
Yii::$app->authManager->update( $name, $permission );

这里是删除

//Returns the named permission.
$permission = Yii::$app->authManager->getPermission( $name );
//Removes a permission or rule from the RBAC system.
Yii::$app->authManager->remove( $permission );

权限的cud都搞定了,查看就不写了

下面是角色控制器

带上这个

use yii\rbac\Role;
/*
 * 角色添加
 */
public function actionCreate() {
  $model = new RoleForm();
  if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
      //实例化角色对象
      $role = new Role();
      $role->name = $model->name;
      $role->type = $model->type;
      //添加角色
      Yii::$app->authManager->add( $role );
  }
  //权限列表( 添加角色的时候我们就可看到当前有没有权限来添加 )
  $permissions = $this->loadPermission();
  //将$model跟$permissions....渲染到视图就好了
}
/*
 * 修改
 * param string $name 修改的角色名
 * param Object $role 跟添加一样提交上来的数据
 */
$bool = Yii::$app->authManager->update( $name, $role );

删除的时候就比较麻烦了

/*
 * param string $name 角色名
 */
$role = Yii::$app->authManager->getRole( $name );//获取当前角色对象
//Returns the child roles.
$childAll = Yii::$app->authManager->getChildren( $role );
if ( isset($childAll) ) {//逐一删除权限
  foreach ($childAll as $value) {
    //Returns the named permission.
    $perObj = Yii::$app->authManager->getPermission($value);
    //Removes a child from its parent.
    Yii::$app->authManager->removeChild( $role, $perObj );
  }
}
Yii::$app->authManager->remove( $role );//最后删除我们的角色了

最最关键的就是我们要给角色赋予权限对吧,如下代码

//当前角色所拥有的权限
$childArray = $this->loadRolePermission( $model->name );//这个就是返回权限数组
if ( !empty( $childArray ) ) {
  $model->child = $childArray;
}
else {
  $model->child = array();
}
//Returns all permissions in the system.
$permissions = Yii::$app->authManager->getPermissions();
$perArr = array();
foreach ($permissions as $key => $value) {
  $perArr[$value->name] = $value->name;
}
if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
  //角色对象
  $child = isset( $_POST['AuthItem']['child'] ) ? $_POST['AuthItem']['child'] : NULL;
  //表单无法验证child所以当为空的时候跳回原页面
  if ( empty( $child ) ) {
    return $this->redirect(..你们要跳的页面..);
  }
  //判断角色是否分配权限,已分配则删除,反之增加新的
  if ( !empty( $childArray ) ) {
    //Removed all children form their parent.
    $bool = Yii::$app->authManager->removeChildren( $model );
    if ( !$bool ) {
      throw new HttpException(404, '别想糊弄我!凑你一脸~~~');
    }
  }
  //当前角色对象
  $role = Yii::$app->authManager->getRole( $model->name );
  //child权限添加
  if( isset( $child ) ) {
    foreach ( $child as $val) {
      //获取权限
      $childObj = Yii::$app->authManager->getPermission($val);
      //给item_child表写入数据(权限表)
      Yii::$app->authManager->addChild( $role, $childObj );
    }
    return $this->redirect(..你们要跳的页面..);
  }
}

最后就是我们最后一个控制器了角色与用户关联

/*
 * 创建角色跟用户之间关联的关键部分代码
 */
//Returns the named role.
$role =Yii::$app->authManager->getRole( $roleName );
// Assigns a role to a user.
Yii::$app->authManager->assign( $role, $userId );<pre name="code" class="php">/*
 * 权限检测
 * param int| string $userId 用户id
 * param string $permission 权限名
 */
Yii::$app->authManager->checkAccess( $userId , $permission ) )

下面是判断权限的

/*
 * 权限检测
 * param int| string $userId 用户id
 * param string $permission 权限名
 */
Yii::$app->authManager->checkAccess( $userId , $permission ) )

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 高手之路(二)
Oct 09 PHP
PHP个人网站架设连环讲(一)
Oct 09 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
php实现图片缩放功能类
Dec 18 PHP
PHP微框架Dispatch简介
Jun 12 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
Laravel日志用法详解
Oct 09 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
May 20 PHP
Yii2简单实现多语言配置的方法
Jul 23 #PHP
yii2控制器Controller Ajax操作示例
Jul 23 #PHP
PHP实现清除MySQL死连接的方法
Jul 23 #PHP
php实现批量修改文件名称的方法
Jul 23 #PHP
golang与PHP输出excel示例
Jul 22 #PHP
PHP微信支付实例解析
Jul 22 #PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 #PHP
You might like
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
php基于session实现数据库交互的类实例
2015/08/03 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
jQuery 白痴级入门教程
2009/11/11 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Python heapq使用详解及实例代码
2017/01/25 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python实现windows下文件备份脚本
2018/05/27 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python for循环remove同一个list过程解析
2019/08/14 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
求职毕业生自荐书
2014/02/08 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
进步之星获奖感言
2014/02/22 职场文书
介绍信怎么写
2015/01/30 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
分享Python异步爬取知乎热榜
2022/04/12 Python