Yii 2授权(RBAC)

Yii 2 授权(RBAC)

授权是指验证用户是否允许做某件事的过程。Yii提供了基于角色的存取控制(RBAC)

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)

在这里插入图片描述

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

2.1 配置Yii RBAC

这里我使用的是Yii 的基础模板 ,要配置2 个地方 1.在 config/console.php ,2在config/web.php

console.php和web.php web.php 中不配会报错 :

 'authManager'=>[
            'class'=>\yii\rbac\DbManager::class,
        ]

传统的是5张表 ,但 yii 进行了改变只有4 张表

要想使用数据库来完成RBAC需要四个数据表

yii\rbac\DbManager::$itemTable: 该表存放授权条目(即角色表和权限表)。默认表名为 “auth_item” 。

yii\rbac\DbManager::$itemChildTable: 该表存放授权条目的层次关系(角色和权限关系表)。默认表名为 “auth_item_child”。

yii\rbac\DbManager::$assignmentTable: 该表存放授权条目对用户的指派情况(用户和角色关系表)。默认表名为 “auth_assignment”。

yii\rbac\DbManager::$ruleTable: 该表存放规则。默认表名为 “auth_rule
还有一张admin 表 可以在我的Yii 认证 这篇博客中找到
在这里插入图片描述
使用数据迁移:

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

使用这几个路由来分配 权限:

 //测试权限
    public function actionAddArticle()
    {
        echo 'add-article';
    }
    public function actionViewArticle()
    {
        echo 'view-article';
    }
    public function actionDelArticle()
    {
        echo 'del-article';
    }

接下来将分配权限和角色

 //用户权限
    /**
     * @throws \yii\base\Exception
     * @throws \Exception
     */
    public function actionRbac()
    {
        $authManager = \Yii::$app->authManager;
        //两个用户admin  zhangsan
        //1添加两个角色 超级管理员  普通员工
        //1.1 创建角色
        $adminRole = $authManager->createRole('超级管理员');
        $memberRole = $authManager->createRole('普通员工');
        //1.2 保存到数据表
        $authManager->add($adminRole);
        $authManager->add($memberRole);
        //2三个权限 admin/add-article admin/view-article admin/del-article
        //2.1 创建权限
        $addPermission = $authManager->createPermission('admin/add-article');
        $viewPermission = $authManager->createPermission('admin/view-article');
        $delPermission = $authManager->createPermission('admin/del-article');
        //2.2 保存到数据表
        $authManager->add($addPermission);
        $authManager->add($viewPermission);
        $authManager->add($delPermission);
        //用户和角色关联  admin-超级管理员  zhangsan-普通员工
        $authManager->assign($adminRole,4);
        $authManager->assign($memberRole,3);
        //角色和权限关联  超级管理员[admin/add-article admin/view-article admin/del-article]
        $authManager->addChild($adminRole,$addPermission);
        $authManager->addChild($adminRole,$viewPermission);
        $authManager->addChild($adminRole,$delPermission);
        // 普通员工[admin/view-article]
        $authManager->addChild($memberRole,$viewPermission);
        echo "分配成功";
    }

以上配置完成后就分配好这些关系了

但具体的实现要靠我们自己来写 使用过滤器:

<?php
namespace  app\filters;

use yii\base\ActionFilter;
use yii\web\HttpException;

class RbacFilter extends  ActionFilter {

    //动作执行前
    public function beforeAction($action)
    {
       //判断当前用户是否拥有该路由(权限)操作权限

        $allow=\Yii::$app->user->can($action->uniqueId);
        if ($allow==false) {
            //判断当前用户是否登录?如果没有登录则跳转到登录页面
            if (\Yii::$app->user->isGuest){
                return  $action->controller->redirect(\Yii::$app->user->loginUrl);
            }
            throw new HttpException(403,"对不起没有权限");
        }
        return parent::beforeAction($action); // TODO: Change the autogenerated stub
    }
}

再到控制器进行行为分配:

public function behaviors()
    {
        return[

        'rbac'=>[
          'class'=>RbacFilter::class,
          'only'=>['add-article','del-article','view-article'],
        ]
            ];
//        return parent::behaviors(); // TODO: Change the autogenerated stub
    }

以上就完成了授权的简单编写。

  • 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、付费专栏及课程。

余额充值