【问题标题】:Yii2 RBAC Rule implementationYii2 RBAC 规则实现
【发布时间】:2016-06-09 09:14:24
【问题描述】:

我看过很多 Yii 2 RBAC 教程,但我不能真正理解如何实现这些规则。在 Yii 2 指南中,他们介绍了规则是如何制定的,但并未真正介绍如何在控制器的行为或其他地方实现它。关于这件事,我真的需要一些启示。

我现在拥有的是一个文档上传系统,其中我有两个角色,即管理员和编码器。基本上,管理员角色可以做所有事情,而编码器角色只能创建、查看-拥有、更新-拥有和删除-拥有。我已经创建了一个名为 encodedBy 的规则。

这是我的 EncoderRule 中的代码

namespace app\rbac; use yii\rbac\Rule;

/**  * Checks if encoded_by matches user passed via params  */ class EncoderRule extends Rule {
    public $name = 'encodedBy';

    /**
     * @param string|integer $user the user ID.
     * @param Item $item the role or permission that this rule is associated with
     * @param array $params parameters passed to ManagerInterface::checkAccess().
     * @return boolean a value indicating whether the rule permits the role or permission it is associated with.
     */
    public function execute($user, $item, $params)
    {
        return isset($params['document']) ? $params['document']->encoded_by == $user : false;
    } }

我将数据存储在“文档”表中,其中有一个名为“encoded_by”的字段。

【问题讨论】:

标签: php yii2 rules rbac


【解决方案1】:

请参阅authorization guide。 也许您错过了在 AuthManager 中分配规则?

$auth = Yii::$app->authManager;
$rule = new \app\rbac\EncoderRule; // <- add here
$auth->add($rule);

$encodedByAuthor = $auth->createPermission('encodedByAuthor');
$encodedByAuthor->ruleName = $rule->name; // <- assign here
$auth->add($encodedByAuthor);
...

【讨论】:

    【解决方案2】:

    我也在为此苦苦挣扎。到目前为止,我只能弄清楚,$params['post'] 绝对不适合我。我不知道我应该在哪里定义以使其工作。但是我可以弄清楚based on the post of Joel Small,如果我只是这样做(我想简单地拒绝访问更新表单,以防在某些情况下与模型状态有关):

    应用\rbac\ZnwRule.php:

    namespace app\rbac;
    
    use yii\rbac\Rule;
    use app\models\Znw;
    
    class ZnwRule extends Rule {
    
        public function execute($user, $item, $params) {
            $znw = Znw::findOne(\Yii::$app->request->get('id'));
            return $znw->created_by || $znw->zwz_id == 0 || !$znw->created_at ? false : true;
        }
    }
    

    然后在 ZnwController 中:

    public function actionUpdatezd($id) {
        if (\Yii::$app->user->can('updatezd')) {
        ...
        } else {
            throw new \yii\web\ForbiddenHttpException('Sorry, you are not allowed to do that.');
        }
    

    我在 yii2-admin 中定义了我有一个规则

    名称:ZnwRule

    类:app\rbac\ZnwRule

    我创建了一个名为updatezd权限

    名称:updatezd

    规则:ZnwRule

    我已经用一个主控制器启动了我的应用程序,我正在检查 yii2-admin 中是否允许某个角色的路由,并且所有其他控制器都扩展了这个。现在我必须处理 permissionsrules,我必须将路由也添加到权限中。 我相信它可以更容易完成,但至少到目前为止它似乎正在工作。不多,但我希望它在一定程度上有所帮助。

    【讨论】:

      【解决方案3】:

      如果您需要简单的角色检查,您可以扩展 AccessRule 类以适应新角色,而无需深入研究完整的基于角色的访问控制。查看本教程以获取完整的详细信息:Simpler Role Based Authorization in Yii 2.0

      这是我发现的理解、实施和维护角色的最简单方法,但是您将权衡完整 RBAC 提供的广泛灵活性以换取简单性。

      完全披露:我是这篇博文的作者。

      【讨论】:

        【解决方案4】:

        如果我清楚地理解你,你想使用 Yii2 RBAC Rule 来实现对系统用户(管理员和编码器)的一些权限。嗯,这在某种程度上是相当直截了当的

        Yii2 有用于此目的的现有表。这些表是 我。 auth_assignment ii. auth_item 三。 auth_item_child iv. auth_rule

        您需要做的第一件事是选择您要使用的 authManager,无论是 PhpManager 还是 DBManager,但我建议您使用 DBManager,因为这是我使用的

        如果你使用的是Yii2 Basic模板,在web.php的components下添加如下代码

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

        如果Yii2 Advanced模板,在\common\config文件夹内main.php的components下添加以下代码行

        完成上述步骤后,

        • 从命令行运行 yii migrate --migrationPath=@yii/rbac/migrations

        以上代码将为您生成/创建之前在数据库中自动列出的四个表

        创建您的 RBAC 规则。

        这需要您创建权限和角色。

        对于基本模板,

        • 在命令文件夹中创建一个文件并将其命名为 RbacController.php

        查看http://pastebin.com/RAKpZX2J 了解它的外观

        对于高级模板, - 创建相同的文件,但它将位于 console\controllers\RbacController.php 中

        完成了所有这些,

        • Run yii rbac/init //这将运行 RbacController 文件中的 actionInit()

        如果您成功创建了上述所有内容,您可以执行以下操作来了解用户是否具有权限

        if(Yii::$app->user->can('createUser')){
        
        }
        

        我希望这会有所帮助..

        【讨论】:

        • 谢谢,但是规则怎么样?那是为了创建角色和权限,我已经有了。我的问题是如何在控制器中实现规则???
        • @C.诺里斯,你用过规则吗,如果用过,可以发个例子吗?
        猜你喜欢
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 2019-11-24
        • 2019-11-11
        • 1970-01-01
        • 2021-09-30
        相关资源
        最近更新 更多