Product.supplierID = Supplier.supplierID
--------- ----------
|Product|---------|Supplier|
--------- ----------
|
| Supplier.supplierID = User.supplierID
|
---------
| User |
---------
使用上述表結構,該應用程序使用的子類的ActiveController
,與重寫prepareDataProvider
限制每個Product
在User
一個登錄的index
列表可以看到的那些具有匹配supplierID
值。 方法ProductController
中的這種情況。Yii2 - 覆蓋的checkAccess在休息ActiveController
$actions['index']['prepareDataProvider'] = function($action)
{
$query = Product::find();
if (Yii::$app->user->can('supplier') &&
Yii::$app->user->identity->supplierID) {
$query->andWhere(['supplierID' => Yii::$app->user->identity->supplierID]);
}
return new ActiveDataProvider(['query' => $query]);
};
這工作得很好,但是我正在尋找使用checkAccess()
限制actionView()
單個Product
。
目前,在User
一個記錄可以通過改變在URL中productID
訪問Product
中,是否擁有相應的supplierID
。
它看起來像我不能訪問Product
的特定實例,檢查supplierID
,直到actionView()
已返回,這是我希望檢查發生時。
我可以覆蓋checkAccess()
限制訪問並拋出相應的ForbiddenHttpException
?
所以,你想禁止從產品ID訪問URL。 –
嗯,也許?沒有從這個方向想到它。更多的是考慮不返回不允許的數據,但可能會有一個解決方案,將'productID'作爲'GET'參數。一定要考慮一下... –