[英]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 下添加以下代碼行
完成上述步驟后,
上面的代碼將為您生成/創建之前在數據庫中自動列出的四個表
創建您的 RBAC 規則。
這需要您創建權限和角色。
對於基本模板,
請參閱http://pastebin.com/RAKpZX2J以了解它的外觀
對於高級模板, - 創建相同的文件,但它會在 console\\controllers\\RbacController.php 中
做完這一切,
如果您成功創建了上述所有內容,您可以執行以下操作來了解用戶是否具有權限
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.