2016-02-26 87 views
8

嗨,大家好,我看到了很多的Yii 2 RBAC的教程,但我不能真正体会到如何实施这些规则。在Yii的2引导他们推出的规则是如何制造的,但没有真正如何能在控制器的行为或者其他地方实施。对于这件事我真的需要一些启发。Yii2 RBAC规则实施

我现在有一个文件上传系统,在那里我有两个角色,即管理&编码器。基本上,管理角色可以完成所有工作,而编码角色只能创建,查看拥有,更新拥有和删除拥有。我已经创建了一个名为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” 我希望你们能帮助我在此。 非常感谢!

+0

对于任何不确定其工作原理的人来说,本视频对解释RBAC做得非常好:https://www.youtube.com/watch?v = vLb8YATO-HU – TheStoryCoder

回答

2

如果我理解你清楚,你要使用Yii2 RBAC规则来实现对系统用户(管理员和编码器)的一些权限。那么,这是很简单的在一定程度上为此

Yii2已经现有的表。这些表是 我。 auth_assignment ii。 auth_item iii。 auth_item_child iv。 auth_rule你需要做的

第一件事就是选择你要使用无论是PhpManager或DBManager其authManager但我会建议你使用DBManager原因是,它是我用

如果您正在使用在Yii2基本的模板,添加以下代码行下部件web.php

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

如果Yii2高级模板,在main.php添加以下代码行下组件\公用\ config文件夹中

做完上述步骤所述,

  • 运行YII迁移--migrationPath = @ YII /从命令行RBAC /迁移

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

创建您的RBAC规则。

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

对于基本的模板,

  • 创建一个文件,并将其命名为RbacController.php内部命令文件夹

http://pastebin.com/RAKpZX2J,看看它的样子

对于高级模板, - 创建相同的文件,但它将在控制台\ controllers \ RbacController内。PHP

做完这一切,

  • 运行警予RBAC/INIT //此预订购运行actionInit()的RbacController文件

里面,如果你成功地创建了所有上面所说的,你可以做这样的事情知道,如果一个用户有权限

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

} 

我希望这有助于..

+3

谢谢,但规则如何?这是为了创建角色和权限,我已经有了。我的问题是如何在控制器中实现规则? –

+0

@C。诺里斯,你有没有使用规则,如果是的话,你能举个例子吗? – Ludo

0

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

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

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

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管理员定义,我有一个规则

名称:ZnwRule

类:应用程序\ RBAC \ ZnwRule

,我创建了一个许可称为updatezd

名称:updatezd

规则:ZnwRule

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