Product.supplierID = Supplier.supplierID
--------- ----------
|Product|---------|Supplier|
--------- ----------
|
| Supplier.supplierID = User.supplierID
|
---------
| User |
---------
Stosując powyższą strukturę tabeli, aplikacja wykorzystuje podklas ActiveController
, z zastąpionej prepareDataProvider
aby ograniczyć listę index
każdego Product
zalogowanego User
widać do tych z pasującymi supplierID
wartości. Coś takiego w metodzie actions()
z ProductController
.Yii2 - Przestawianie checkAccess w spoczynku 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]);
};
Działa to dobrze, ale szukam w użyciu checkAccess()
ograniczyć actionView()
dla pojedynczego Product
.
Obecnie zalogowanego User
może uzyskać dostęp do Product
zmieniając productID
w URL, czy mają odpowiedni supplierID
.
Wygląda na to, że nie mogę uzyskać dostępu do konkretnej instancji Product
, aby sprawdzić supplierID
, aż zwróci się actionView()
, kiedy chcę, aby to się stało.
Czy mogę zastąpić checkAccess()
, aby ograniczyć dostęp i rzucić odpowiednią ForbiddenHttpException
?
tak , chcesz wyłączyć dostęp do identyfikatora "identyfikatora produktu" z adresu URL. –
hmm, być może? nie myślałem o tym z tego kierunku. bardziej myślał o niezwracaniu danych, które są niedozwolone, ale może istnieć rozwiązanie polegające na braku parametru "identyfikator produktu" jako parametru "GET". coś do przemyślenia na pewno ... –