2017-04-19 13 views
0

Yii2とAngular 2クライアントでRESTサービスを開発しました。ベアラJWT認証の使用。 たとえば、uri:http://127.0.0.1/v1/accounts/123456/metersがあり、自分が所有するアカウントですべてのユーザーのメーターを返す必要があります。認証されたユーザーがRESTレスポンスのハンドラであるかどうかを確認する方法

アプライド・ルータのルール:(

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

をしかし、この方法で認証されたユーザーが得ることができます見えます

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

アクションAccountController :: actionMeters:

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

コントローラは以下の動作を持っていますGET accountIdパラメータを変更した場合)のメーターを表示します。

ユーザーとアカウントをリンクするデータベースにuser_accountテーブルがありますが、アプリケーションのどの場所に正しくチェックする必要があるかわかりません。

認証されたユーザーが指定したaccountIdパラメータでこのリソースにアクセスできるかどうかを確認する方法はありますか。 ありがとうございます。

答えて

0

私はアクセスルールでmatchCallbackを決定するソリューションを見つけました。今では見た目です:

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

とユーザーモデルでhasAccountメソッドを定義します。

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

それは正しい動作します。それは適切な解決策ですか?

関連する問題