後跟this guide我無法獲得「更新自己的記錄」類型的功能工作。這是我的。Yii2 AccessControl和RBAC更新自己的記錄
管理員和作者角色。作者擁有imageUpdateOwn
權限,該權限在兒童時擁有imageUpdate
權限。 imageUpdateOwn
權限已將isOwner
規則分配給它。所有其他相關/相關的代碼如下。
數據庫
OwnerRule.php
的Image
模型具有created_by
屬性,它是記錄的所有者。
public function execute($user, $item, $params)
{
return isset($params['model']) ? $params['model']->created_by == $user : false;
}
ImageController.php AccessControl的
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['update'],
'roles' => ['imageUpdate'],
],
[
'allow' => true,
'actions' => ['delete'],
'roles' => ['imageDelete'],
],
[
'allow' => true,
'actions' => ['index', 'view', 'create'],
'roles' => ['@'],
],
[
'allow' => false,
],
],
],
];
}
ImageController.php行動
public function actionUpdate($id)
{
$model = $this->findModel($id);
if (\Yii::$app->user->can('imageUpdate', ['model' => $model])) {
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
} else {
throw new HttpException(403, 'You do not have permission to update this record.');
}
}
在我的測試,我登錄的作者和上傳圖像1000然後登錄作爲管理員和上傳的圖像1001.在登錄時執行以下快速測試因爲每個用戶都會得到預期的結果。
$image1000 = \app\models\Image::findOne(1000); // author uploaded
$image1001 = \app\models\Image::findOne(1001); // admin uploaded
echo \Yii::$app->user->can('imageUpdate', ['model' => $image1000]) . "<br>";
echo \Yii::$app->user->can('imageUpdate', ['model' => $image1001]);
當以管理員身份登錄時,每個echo語句都會得到「true」。以作者身份登錄時,我只對圖像1000獲得「true」。這告訴我授權正在按照我所創建的isOwner規則返回正確的權限。
但是,當我嘗試去更新操作時,我甚至無法通過訪問控制。我沒有獲得我在動作中指定的403錯誤(這是我期望的),而是得到了「不允許執行此操作」的通用錯誤。這似乎是因爲我已將默認訪問設置爲拒絕。如果我將默認訪問權限設置爲允許,我可以完成操作並獲得預期的403錯誤消息。這告訴我行動不允許我通過。
我不知道,如果imageUpdateOwn
作用應在訪問控制上市而擁有它的存在並不那麼具有後者改變的結果(大概是因爲imageUpdate
是imageUpdateOwn
孩子,筆者也將有前)。
上述內容中缺少的內容完全阻止我在以作者身份登錄時訪問更新操作?
編輯1
或許是因爲該模型沒有在訪問控制正在檢查的時間加載,CREATED_BY用戶不能進行評估。如果是這樣,我很困惑,因爲作者有imageUpdate
通過imageUpdateOwn
它應該允許訪問繼續。除非在與imageUpdateOwn
相關的規則通過時它們僅獲得imageUpdate
。在這種情況下,作者將永遠不會「獲得」與imageUpdate
角色相關的訪問權限,直到可以對模型進行評估。這意味着我必須允許所有經過身份驗證的用戶訪問update
操作,並且只有在模型加載後才檢查操作本身的權限。