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 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
php实现httpRequest的方法
Mar 13 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
PHP架构及原理知识点详解
Dec 22 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
PHP添加MySQL数据记录代码
2008/06/07 PHP
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
浅析is_writable的php实现
2013/06/18 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
javascript web对话框与弹出窗口
2009/02/22 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
Python通过正则表达式选取callback的方法
2015/07/18 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
pandas中Timestamp类用法详解
2017/12/11 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
高一家长会邀请函
2014/01/12 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
春节请假条
2014/04/11 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
大学新生入学感想
2015/08/07 职场文书
Python学习之迭代器详解
2022/04/01 Python