• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例

    本文实例讲述了YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用。分享给大家供大家参考,具体如下:

    在使用YII2中自带的RBAC时,需要先配置config/web.php:

    return [
      // ...
      'components' => [
        'authManager' => [
          'class' => 'yii\rbac\DbManager',
        ],
        // ...
      ],
    ];
    

    如果你需要运行yii migrate来创建表,那么config/console.php也需要同上面一样配置一下。

    cmd进入项目目录,运行如下命令:

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

    你会发现在数据库中创建了四张表

    auth_assignment 角色与用户的关联表
    auth_item 存放角色与权限,通过type字段区分
    auth_item_child 存放角色与权限的上下级关系
    auth_rule 规则表,用于扩展权限功能
    

    为了演示,我们在控制器下分别写四个方法,分别用来创建权限,创建角色,指派角色,使用规则。

    IndexController.php代码如下:

    ?php
    
    namespace app\controllers;
    
    use YII;
    use app\models\MyUserLogin;
    use app\rbac\UserUpdSelfRule;
    use app\controllers\BaseController;
    
    class IndexController extends BaseController
    {
    
      //首页
      public function actionIndex()
      {
        $this->renderPartial('index');
      }
    
      //登陆
      public function actionLogin()
      {
        if (YII::$app->request->isPost) {
          $user = new MyUserLogin();
          $user->load(YII::$app->request->post(), '');
    
          if ($user->login()) {
            echo '登陆成功';
          } else {
            echo '登陆失败';
          }
    
        } else {
          return $this->renderPartial('login');
        }
      }
    
      //为了演示,这里我们添加几条权限
      public function actionPer()
      {
        $auth = YII::$app->authManager;
        //创建用户删除权限
        $per = $auth->createPermission('user/del');
        $per->description = '删除用户';
        $auth->add($per);
        //创建用户更新权限
        $per = $auth->createPermission('user/upd');
        $per->description = '更新用户';
        $auth->add($per);
        //创建用户添加权限
        $per = $auth->createPermission('user/add');
        $per->description = '添加用户';
        $auth->add($per);
        //创建用户查看权限
        $per = $auth->createPermission('user/list');
        $per->description = '查看用户列表';
        $auth->add($per);
      }
    
      //添加角色
      public function actionRole()
      {
        $auth = YII::$app->authManager;
    
        //添加管理员角色
        $admin = $auth->createRole('admin');
        $admin->description = '管理员';
        $auth->add($admin);
        //给管理员赋予权限
        $auth->addChild($admin, $auth->getPermission('user/del'));
        $auth->addChild($admin, $auth->getPermission('user/upd'));
        $auth->addChild($admin, $auth->getPermission('user/add'));
        $auth->addChild($admin, $auth->getPermission('user/list'));
    
        //添加普通员工角色
        $employee = $auth->createRole('employee');
        $employee->description = '普通员工';
        $auth->add($employee);
        $auth->addChild($employee, $auth->getPermission('user/list'));
        $auth->addChild($employee, $auth->getPermission('user/add'));
      }
    
      //给用户指派角色
      public function actionAssign()
      {
        $auth = YII::$app->authManager;
    
        //注意这里的2是用户的ID,即你用户表user里的ID
        //也可通过YII::$app->user->id获取
        $auth->assign($auth->getRole('admin'), 1);
    
        $auth->assign($auth->getRole('employee'), 2);
      }
    
      //添加规则
      public function actionRule()
      {
        $auth = YII::$app->authManager;
        $rule = new UserUpdSelfRule();
        $auth->add($rule);
    
        //创建权限,与规则关联
        $per = $auth->createPermission('user/upd/updSelf');
        $per->description = '用户只能修改自已';
        $per->ruleName = $rule->name;
        $auth->add($per);
    
        //这里,要注意,要把user/upd/updSelf权限设为user/upd的父级
        //要不然,普通员工访问user/upd这个方法会被拦住
        $auth->addChild($per, $auth->getPermission('user/upd'));
        //给普通员工赋予user/upd/updSelf权限,注意我们这里并没有给员工赋予user/upd权限
        $auth->addChild($auth->getRole('employee'), $per);
      }
    }

    我们在项目目录下创建rbac目录,并创建UserUpdSelfRule.php,来实现用户只能修改自已信息的规则。

    ?php
    
    //注意命名空间要跟你的目录对应
    namespace app\rbac;
    
    use yii\rbac\Rule;
    
    //必须继承自yii\rbac\Rule
    class UserUpdSelfRule extends Rule
    {
      public $name = 'userUpdSelf';
    
      //必须要实现execute方法
      //$user表示用户ID
      //$item规则相关的角色或者权限
      //$params传递过来的参数
      public function execute($user, $item, $params)
      {
        //如果没有设置参数ID,直接返回true
        if (!isset($params['id'])) {
          return true;
        }
        //判断id是否是当前用户ID
        return ($params['id'] == $user) ? true : false;
      }
    }

    我们访问index/per查看数据表中的变化。

    访问index/role结果如下:

    访问index/assign结果如下:

    访问index/rule结果如下:

    为了能够对我们的模块,控制器,方法进行权限控制,我们需要创建一个基类来统一处理,上面的控制器就是继承自基类。

    BaseController.php代码如下:

    ?php
    
    namespace app\controllers;
    
    use YII;
    use yii\web\Controller;
    
    class BaseController extends Controller
    {
      //不需要验证的
      protected $noCheckAccess = [
        'index/index',
        'index/per',
        'index/role',
        'index/assign',
        'index/rule',
        'index/login',
      ];
    
      //不需要登陆的
      protected $noLogin = [
        'index/login',
      ];
    
      //验证权限
      //注意,不要把获取模块名,控制器名,方法名写到init()函数里,那样是获取不到的
      //这个坑我已经踩了,大家就不用再去踩了
      public function beforeAction($action)
      {
        $mid = !empty($this->module->id) ? $this->module->id : '';
        $cid = !empty($this->id) ? $this->id : '';
        $aid = !empty($action->id) ? $action->id : '';
    
        //如果模块为basic,我们只验证控制器/方法
        if ($mid == 'basic') {
          $per = "{$cid}/{$aid}";
        } else {
          $per = "{$mid}/{$cid}/{$aid}";
        }
    
        if (!in_array($per, $this->noLogin)) {
          if (!$this->checkOnline()) {
            $this->redirect('index/login');
          }
        }
    
        if (!in_array($per, $this->noCheckAccess)) {
          if (!YII::$app->user->can($per)) {
            die('你没有权限');
          }
        }
    
        return parent::beforeAction($action);
      }
    
      //检查是否在线
      public function checkOnline()
      {
        return !empty(YII::$app->user->id) ? true : false;
      }
    }
    

    为了演示,我们创建一个UserController.php,代码如下:

    ?php
    
    namespace app\controllers;
    
    use YII;
    use app\controllers\BaseController;
    
    class UserController extends BaseController
    {
      public function actionUpd()
      {
        $id = YII::$app->request->get('id', 0);
    
        echo 'user id : ', YII::$app->user->id, 'br>';
    
        //先判断用户有没有只能修改自已的权限
        if (YII::$app->user->can('user/upd/updSelf')) {
          //然后再判断修改ID是否与自已的ID一样,在UserUpdSelfRule里进行判断
          if (YII::$app->user->can('user/upd/updSelf', ['id' => $id])) {
            echo '有权修改自已';
          } else {
            echo '不能修改除自已以外的';
          }
        } else {
          echo '修改所有';
        }
      }
    
      public function actionDel()
      {
        echo 'user id : ', YII::$app->user->id, 'br>';
        echo 'user del';
      }
    
      public function actionList()
      {
        echo 'user id : ', YII::$app->user->id, 'br>';
        echo 'user list';
      }
    
      public function actionAdd()
      {
        echo 'user id : ', YII::$app->user->id, 'br>';
        echo 'user add';
      }
    }
    

    我的用户表里有两个用户

    分别登陆这两个用户,然后让他们访问user/add,user/del,user/list,user/upd,结果如下:

    admin用户状态如下:

    test用户状态如下:

    test之所以能够访问user/upd是因为我们把user/upd/updSelf设为了user/upd的父级,如果没有设置,这里是会被拦住的。

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

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

    您可能感兴趣的文章:
    • yii2.0框架实现上传excel文件后导入到数据库的方法示例
    • YII2框架中日志的配置与使用方法实例分析
    • YII2框架中查询生成器Query()的使用方法示例
    • YII2框架中behavior行为的理解与使用方法示例
    • YII2 全局异常处理深入讲解
    上一篇:Laravel框架下的Contracts契约详解
    下一篇:YII2框架中查询生成器Query()的使用方法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例 YII2,框架,中,使用,RBAC,对,