Yii2 RBAC规则实施

时间:2016-02-26 08:31:10

标签: php yii2 rule rbac

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

我现在拥有的是一个文件上传系统,我有两个角色,即admin&编码器。基本上,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;
    } }

我将数据存储在'文档'表格中我有一个名为' encoded_by' 我希望你们能帮助我。 非常感谢!!!

4 个答案:

答案 0 :(得分: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高级模板,请在\ 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 :(得分: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中使用某个角色的路由,而所有其他控制器都扩展了这个。既然我必须处理权限规则,我还必须将路由添加到权限中。 我相信它可以更容易完成,但至少它似乎工作到目前为止。它并不多,但我希望它在某种程度上有所帮助。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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);
...