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

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

(0)

相关推荐

  • Yii2搭建后台并实现rbac权限控制完整实例教程

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际项目中本地的数据库往往跟线上数据库不一致, 我们这里配置到main-local.php就可以了,产品上线后,我们可以使用git或者svn忽略掉main-local.php,线上直接部署. 我们这里使用的mysql数据库,配置如下 当然啦,上面红圈圈的信息需要你自己手动修改掉,要是十分巧合跟我的一样

  • 深入浅析Yii admin的权限控制

    说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等.最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门老大下面分子部门等等,恶心的需求.我们这个项目使用yii框架开发,yii在php届还是比较流行的,虽然说laravel现在横行,但是一些部门一些团队还是采用了yii框架,比如我们. 我是刚接触yii这个框架,开始的时候对这种面向组件的框架甚是别扭.当时打算自己写权限的,自己创建权限表,关联表等,但是

  • yii权限控制的方法(三种方法)

    本文实例讲述了yii权限控制的方法.分享给大家供大家参考,具体如下: 这里摘录以下3种: 1. 通过accessControl: public function filters() { return array( 'accessControl', // perform access control for CRUD operations ); } /** * Specifies the access control rules. * This method is used by the 'acc

  • 浅析Yii中使用RBAC的完全指南(用户角色权限控制)

    写在前面    * 我的feed地址已经修改为: http://feeds.imdong.net ,请更新您的阅读器.    * 以下内容适合Yii 1.0.x,其他版本可能有略微的差别.    * 根据您的评论和反馈,本文会不断进行修改和补充,以方便新学习者.开始准备Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库在配置数组中,增加以下内容: 复制代码 代码如下: 'compon

  • 深入解析yii权限分级式访问控制的实现(非RBAC法)

    yii framework 提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,我这里要讲的是第一套(因为我也刚刚学到这里).如 果你有研究过YII官方的demo blog,一定知道,比如,由gii自动生成的user模块,自动附带了简单的filter权限分配功能,具体细节请参照blog手册的"用户验证"一章 节,以及yii官方指南的"验证和授权"一章节.(注意,我这里所指的模块,只是我个人对与user有关的文件的统称,与y

  • Yii2 rbac权限控制操作步骤实例教程

    本篇的主题是 rbac权限控制的详细操作步骤,注意是操作步骤哦,关于配置与rbac的搭建,我们在yii2搭建完美后台并实现rbac权限控制实例教程说的再清楚不过了. 但是,在很多人的反馈下,说是完全按照本主的步骤来的,丝毫不差,为啥菜单不显示,为啥不显示呢不显示?艾玛,最终在群里帮人调试的时候找到原因了,si分的不容易啊.原因就是你学会了搭建没学会操作啊,啊,啊,我们今天就来详细的说说这rbac的权限控制具体怎么操作!当然,大前提下是你已经按照我们上文成功搭建一套完美的后台并实现了rbac权限控

  • Yii2 rbac权限控制之rule教程详解

    在我们之前Yii2搭建后台并实现rbac权限控制完整实例教程中,不知道你曾经疑惑过没有一个问题,rule表是做什么的,为什么在整个过程中我们都没有涉及到这张表? 相信我不说,部分人也都会去尝试,或百度或google,到头来也会竹篮打水,这部分讲解的内容少之又少啊! 对于一般的权限系统而言,我们之前做的rbac一般情况下是足够的,即时没有rule,相信你也能实现我们用rule实现的功能. 我们就以官网的例子给出一个具体的操作教程,看看这个神秘的rule到底是做什么的! 看需求: 我们有管理员和普通

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

    本文实例讲述了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

  • nuxt.js中间件实现拦截权限判断的方法

    最近在把vue的项目改成基于nuxt.js是 ssr渲染,需要进行权限拦截判断,网上查了不少资料.最终看官方手册解决了,贴一下过程 项目环境 "element-ui":"^2.3.4", "flyio":"^0.5.2", "js-cookie":"^2.2.0", "nuxt":"^1.4.0", 一:首先登录页面 在登录页面script中引入

  • vue中如何实现后台管理系统的权限控制的方法步骤

    一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单中的页面是否能被访问 页面中的按钮(增.删.改)的权限控制是否显示 下面我们就看一看是如何实现这些个权限控制的. 二.接口访问的权限控制 接口权限就是对用户的校验.正常来说,在用户登录时服务器需要给前台返回一个Token,然后在以后前台每次调用接口时都需要带上这个Token, 然后服务端获取到这个Token后进行比对,如果通过则可以

  • vue中如何实现后台管理系统的权限控制的方法示例

    一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单中的页面是否能被访问 页面中的按钮(增.删.改)的权限控制是否显示 权限控制是什么 在权限的世界里服务端提供的一切都是资源,资源可以由请求方法+请求地址来描述,权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源.具体的说,前端对资源的访问通常是由界面上的按钮发起,比如删除某条数据:或由用户进入某一个页面发

  • Vue自定义v-has指令,做按钮权限判断的步骤

    应用场景 以后台管理系统为例,每个用户所拥有的按钮权限不一样.管理员配置权限之后,用户登录时,从接口拿到按钮权限列表,然后根据后台数据判断显示哪些按钮. 简单说一下,自定义指令 Vue.js官网关于自定义指令的讲解 cn.vuejs.org/v2/guide/cu- 基础概念 Vue除了核心功能默认内置的指令(v-model和v-show)还可以注册自定义指令. 在Vue2.0中,代码复用和抽象的主要形式是组件.但有的情况下,仍需要对普通DOM元素进行底层操作,这时候就会用到自定义指令. 譬如,

  • Vue自定义v-has指令实现按钮权限判断

    应用场景 以后台管理系统为例,每个用户所拥有的按钮权限不一样.管理员配置权限之后,用户登录时,从接口拿到按钮权限列表,然后根据后台数据判断显示哪些按钮. 简单说一下,自定义指令 Vue.js官网关于自定义指令的讲解 cn.vuejs.org/v2/guide/cu- 基础概念 Vue除了核心功能默认内置的指令(v-model和v-show)还可以注册自定义指令. 在Vue2.0中,代码复用和抽象的主要形式是组件.但有的情况下,仍需要对普通DOM元素进行底层操作,这时候就会用到自定义指令. 譬如,

  • Asp.net 基于Cookie简易的权限判断

    写入Cookie页面,创建cookie后,设置cookie属性,并添加到Response.Cookies中读取cookie,利用cookie的名字或索引从Request.Cookies中取得改写Cookie,先创建一个同名的cookie,读取Request中同名的cookie,把读取cookie的属性值付给新的对象,加入到Response.Cookies中创建一个BasePage页面,其他的页面继承自这个页面,把权限判断的代码有单个页面的Page_Load转移到BasePage的PreLoad中

  • PHP+MYSQL会员系统的登陆即权限判断实现代码

    复制代码 代码如下: <?php error_reporting(0); session_start(); //数据库连接 $conn = mysql_connect('localhost', 'root', ''); mysql_select_db('chenkun', $conn); mysql_query('SET NAMES UTF-8'); //定义常量 define('ALL_PS', 'PHP'); function user_shell($uid, $shell, $m_id)

随机推荐