2017-04-19 2 views
0

J'ai développé un service REST sur les clients Yii2 et Angular 2. Utilisation de l'authentification Bearer JWT. Par exemple il y a un uri: http://127.0.0.1/v1/accounts/123456/meters, qui devrait renvoyer tous les compteurs de l'utilisateur par compte, dont il est propriétaire.Comment vérifier si l'utilisateur authentifié est gestionnaire de la ressource REST

règle de routeur appliquée:

'<accountId:\w+>/<action:[\w-]+>' => '<action>', 

Contrôleurs a des comportements suivants:

'authenticator' => [ 
    'class' => HttpBearerAuth::className(), 
    'except' => ['options'] 
], 
'access' => [ 
    'class' => AccessControl::className(), 
    'rules' => [ 
     [ 
      'allow' => true, 
      'actions' => ['meters'], 
      'roles' => ['@'], 
     ] 
    ] 
] 

action AccountController :: actionMeters regarde:

public function actionMeters($accountId) 
{ 
    // Call MS SQL procedure 
    $meters = Yii::$app->db->createCommand("EXEC [getMetersByAccountId] :accountId")->bindValue(':accountId', $accountId)->queryAll() 
    return $meters; 
} 

Mais de cette manière l'utilisateur authentifié peut obtenir (si modifier le paramètre GET accountId), qui appartient à un autre utilisateur.

J'ai une table user_account dans la base de données, qui relie les utilisateurs et les comptes, mais je ne sais pas dans quel lieu d'application dois-je effectuer une vérification correctement. Comment faire une vérification si un utilisateur authentifié a un accès à cette ressource par le paramètre accountId spécifié? Merci.

Répondre

0

J'ai trouvé une solution pour déterminer matchCallback dans la règle d'accès. Maintenant, il est l'air:

[ 
    'allow' => true, 
    'actions' => ['meters'], 
    'roles' => ['@'], 
    'matchCallback' => function() { 
     return Yii::$app->user->identity->user->hasAccount(Yii::$app->request->get('accountId')); 
    } 
], 

et définir la méthode de hasAccount dans le modèle de l'utilisateur:

public function hasAccount($accountId) { 
    return $this->hasOne(UserAccount::className(), ['user_id' => 'id'])->where(['account_id' => $accountId])->exists(); 
} 

C'est un travail correct. Est-ce une bonne solution?