Yii 框架自带rbac (文件版)

     各位猿友,今天来点干货

    我们在使用yii框架中自带的rbac时,需要先知道rbac的原理:

    用户->角色->权限    以及  用户和角色之间的关系,角色和权限之间的关系。

    配置授权管理组件

    1.yii config 文件配置(我用的是高级版本)(配置在common/config/main.php 或者main-local.php)

    return   [
         'components'   = >   [
             'authManager'   = >   [
                  'class'   = >   'yii\rbac\PhpManager' ,
           ] ,
     

该授权组件, 可选择由PHP文件存储授权数据或使用数据库存储授权数据. 分别使用yii\rbac\PhpManager和yii\rbac\DbManager实现. 文件存储直观, 编辑简单, 但不适合频繁大量的授权更新操作. 而数据库管理方案适合频繁的授权变动. 请依据自己项目的情况自行选择.  以上的配置中, 选择的PhpManager, 以PHP文件方式存储授权, 此时需要@app/rbac目录(backend/rbac)存在, 并具有可写权限. 如果需要使用数据库管理授权数据, 请看后边的DbManager授权管理小节.

配置完毕后, 使用\Yii::$app->authManager就可以访问到授权组件了

  在数据库中创建表

2.Rbac 支持两种类,PhpManager 和 DbManager ,这里我使用PhpManager 。

yii migrate(运行这个命令,生成user表)

  生成一个rbac权限

// 增加的用于测试权限管理方法的动作, 放在控制器中请求执行即可
public   function   actionAuth ( )
{       
         $auth   =   \ Yii:: $app -> authManager ;
         // 删除全部
         $auth -> removeAll ( ) ;
 
         // 增加权限
         $postAdd   =   $auth -> createPermission ( 'postAdd' ) ;
         $postAdd -> description   =   '文章添加' ;
         $auth -> add ( $postAdd ) ;
         $postDelete   =   $auth -> createPermission ( 'postDelete' ) ;
         $postDelete -> description   =   '文章删除' ;
         $auth -> add ( $postDelete ) ;
         $postUpdate   =   $auth -> createPermission ( 'postUpdate' ) ;
         $postUpdate -> description   =   '文章编辑' ;
         $auth -> add ( $postUpdate ) ;
         $postSelect   =   $auth -> createPermission ( 'postSelect' ) ;
         $postSelect -> description   =   '文章查看' ;
         $auth -> add ( $postSelect ) ;
 
         // 增加角色
         $author   =   $auth -> createRole ( 'author' ) ;
         $auth -> add ( $author ) ;
         $reader   =   $auth -> createRole ( 'reader' ) ;
         $auth -> add ( $reader ) ;
         $editor   =   $auth -> createRole ( 'editor' ) ;
         $auth -> add ( $editor ) ;
 
 
         // 为角色赋予权限
         $auth -> addChild ( $author ,   $postAdd ) ; // 作者 添加文章
         $auth -> addChild ( $author ,   $postUpdate ) ; // 作者 编辑文章
         $auth -> addChild ( $reader ,   $postSelect ) ; // 读者 看文章
         $auth -> addChild ( $editor ,   $postDelete ) ;
         $auth -> addChild ( $editor ,   $postSelect ) ;
         $auth -> addChild ( $editor ,   $author ) ;
         $auth -> addChild ( $editor ,   $reader ) ;
 
         // 为用户分配角色
         $auth -> assign ( $author ,   2 ) ;
         $auth -> assign ( $reader ,   2 ) ;
         $auth -> assign ( $reader ,   3 ) ;
         $auth -> assign ( $reader ,   4 ) ;
         $auth -> assign ( $editor ,   5 ) ;
}
在任意控制器中运行以上代码   会在rbac文件夹中自动生成关系表。
我们在yii框架自带的表单页面中注册账号并登陆  此时会根据用户ID给相应的用户分配角色及权限。
下面我们需要再次创建一个控制器来验证相应的用户是否拥有正确的角色及权限

权限的校验(动态校验)


  public   function   actionAdd ( )
     {
         $user   =   \ Yii:: $app -> user ;
         if   ( !   $user -> can ( 'postAdd' ) )   {
             return   $this -> renderContent ( '没有权限执行该操作' ) ;
         }
 
         return   $this -> renderContent ( '添加' ) ;
     }
到此   我们就完成了通过文件的形式实现rbac

下次  给大家介绍如何通过数据库建表的形式来实现RBAC





  


   




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
yii2是一个流行的PHP框架,它提供了一个强大的rbac权限控制系统。下面是一个yii2_rbac的实例: 1.首先,我们需要在Yii2中安装yii2-admin扩展。可以通过以下命令进行安装: ```shell composer require mdmsoft/yii2-admin "~2.0" ``` 2.安装完成后,我们需要在配置文件中添加以下内容: ```php 'modules' => [ 'admin' => [ 'class' => 'mdm\admin\Module', ], ], ``` 3.然后,我们需要在数据库中创建以下表: ```sql CREATE TABLE `auth_rule` ( `name` varchar(64) NOT NULL, `data` text, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL, PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `auth_item` ( `name` varchar(64) NOT NULL, `type` int(11) NOT NULL, `description` text, `rule_name` varchar(64) DEFAULT NULL, `data` text, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL, PRIMARY KEY (`name`), KEY `rule_name` (`rule_name`), CONSTRAINT `auth_item_ibfk_1` FOREIGN KEY (`rule_name`) REFERENCES `auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `auth_item_child` ( `parent` varchar(64) NOT NULL, `child` varchar(64) NOT NULL, PRIMARY KEY (`parent`,`child`), CONSTRAINT `auth_item_child_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `auth_item_child_ibfk_2` FOREIGN KEY (`child`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `auth_assignment` ( `item_name` varchar(64) NOT NULL, `user_id` varchar(64) NOT NULL, `created_at` int(11) DEFAULT NULL, PRIMARY KEY (`item_name`,`user_id`), CONSTRAINT `auth_assignment_ibfk_1` FOREIGN KEY (`item_name`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 4.接下来,我们需要在配置文件中添加以下内容: ```php 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], ], ``` 5.然后,我们需要在控制器中添加以下代码: ```php use yii\filters\AccessControl; use yii\filters\VerbFilter; use mdm\admin\components\AccessControl as AdminAccessControl; public function behaviors() { return [ 'access' => [ 'class' => AdminAccessControl::className(), 'allowActions' => [ 'site/login', 'site/logout', 'site/error', ] ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['post'], ], ], ]; } ``` 6.最后,我们需要在视图文件中添加以下代码: ```php use mdm\admin\components\Helper; <?= Helper::checkRoute('site/index') ? Html::a('Dashboard', ['/site/index']) : '' ?> <?= Helper::checkRoute('site/about') ? Html::a('About', ['/site/about']) : '' ?> <?= Helper::checkRoute('site/contact') ? Html::a('Contact', ['/site/contact']) : '' ?> <?= Helper::checkRoute('site/signup') ? Html::a('Signup', ['/site/signup']) : '' ?> <?= Helper::checkRoute('site/login') ? Html::a('Login', ['/site/login']) : '' ?> <?= Helper::checkRoute('site/logout') ? Html::a('Logout', ['/site/logout'], ['data-method' => 'post']) : '' ?> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值