簡體   English   中英

Yii2 RBAC 規則實現

[英]Yii2 RBAC Rule implementation

我看過很多 Yii 2 RBAC 教程,但我真的不明白如何實現這些規則。 在 Yii 2 指南中,他們介紹了規則是如何制定的,但沒有真正介紹如何在控制器的行為或其他地方實現它。 關於這件事,我真的需要一些啟示。

我現在擁有的是一個文件上傳系統,我有兩個角色,即管理員和編碼器。 基本上,管理員角色可以做所有事情,而編碼器角色只能創建、查看自己、更新自己和刪除自己。 我已經創建了一個名為 encodingBy 的規則。

這是我在 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”的字段。

如果我理解你很清楚,你想使用 Yii2 RBAC Rule 來實現對系統用戶(管理員和編碼器)的一些權限。 嗯,這在某種程度上是很直接的

Yii2 有用於此目的的現有表。 這些表是i。 auth_assignment ii. auth_item iii. auth_item_child iv. 認證規則

您需要做的第一件事是選擇要使用 PhpManager 或 DBManager 的 authManager,但我建議您使用 DBManager 的原因是,這是我使用的

如果您使用的是 Yii2 Basic 模板,請在 web.php 中的 components 下添加以下代碼行

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

如果Yii2 Advanced template ,在\\common\\config 文件夾內 main.php 的 components 下添加以下代碼行

完成上述步驟后,

  • 從命令行運行 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')){

}

我希望這有幫助..

我也在為此苦苦掙扎。 直到現在我才知道, $params['post']絕對不適合我。 我不知道在哪里 - 我應該定義什么才能使其工作。 但是我可以根據 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 中是否允許該路由用於某個角色,所有其他控制器都擴展了這個控制器。 現在我必須處理權限規則,我還必須將路由添加到權限中。 我相信它可以更容易地完成,但至少到目前為止它似乎正在起作用。 這並不多,但我希望它在某種程度上有所幫助。

如果您需要簡單的角色檢查,您可以擴展AccessRule類以適應新角色,而無需深入研究完整的基於角色的訪問控制。 查看本教程以獲取完整詳細信息: Yii 2.0 中更簡單的基於角色的授權

這是我發現的理解、實現和維護角色的最簡單方法,但是為了簡單起見,您將權衡完整 RBAC 提供的廣泛靈活性。

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

請參閱授權指南 您可能錯過了在 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);
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM