2016-02-26 84 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的路由爲某個角色,並且所有其他控制器擴展這個。現在我必須處理權限規則,我不得不將路由添加到權限。 我相信它可以更容易完成,但至少它似乎工作到目前爲止。這並不多,但我希望它在一定程度上有所幫助。