Yii2 RBAC规则实施

问题描述 投票:9回答:4

大家好,我已经看过很多Yii 2 RBAC教程,但我真的不太欣赏如何实现规则。在Yii 2指南中,他们介绍了如何制定规则,但实际上并不是如何在控制器的行为或其他地方实现规则。关于这个问题我真的需要一些启示。

我现在拥有的是一个文件上传系统,我有两个角色,即admin和encoder。基本上,admin角色可以完成所有操作,而编码器角色只能创建,查看拥有,更新拥有和删除拥有。我已经创建了一个名为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;
    } }

我将数据存储在'document'表中,我有一个名为'encoded_by'的字段。我希望你们可以帮助我。非常感谢!!!

php yii2 rule rbac
4个回答
2
投票

如果我清楚地了解您,您希望使用Yii2 RBAC规则对系统用户(管理员和编码器)实施一些权限。嗯,这在某种程度上非常直接

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

你需要做的第一件事是选择你想要使用哪个authManager的PhpManager或DBManager,但我会建议你使用DBManager的原因是,这是我用的

如果您使用的是Yii2 Basic模板,请在web.php中的组件下添加以下代码行

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

如果是Yii2 Advanced模板,请在\ common \ config文件夹中的main.php中的组件下添加下面的代码行

完成上述步骤后,

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

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

创建RBAC规则。

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

对于基本模板,

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

请参阅http://pastebin.com/RAKpZX2J以了解它的外观

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

完成所有这些,

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

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

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

}

我希望这有帮助..


1
投票

我也在苦苦挣扎。直到现在我才能弄明白,$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

class:app \ rbac \ ZnwRule

我创建了一个名为updatezd的权限:

name:updatezd

规则:ZnwRule

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


0
投票

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

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

完全披露:我是博客文章的作者。


0
投票

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);
...
© www.soinside.com 2019 - 2024. All rights reserved.