2017-06-19 17 views
0

表示ユーザーアクションでは、ログオンユーザーにこのユーザーを表示する権利があるかどうかを確認したいと思います。だから私はUserVoterを作成しました。私はアクションで私のvarの名前を変更した場合、私は、アノテーションを使用して投票するためのURLで定義されたユーザーを渡すしようとすると しかし、私は両方$subject$token->getUser()Symfony UserVoterは、現在のログインユーザーURLのユーザーの代わりにユーザー

を使用してログインしているユーザーを取得し、それは罰金($ユーザに動作します - > $ foo)。

私のvar名を変更しないためにどうすればいいですか?

コントローラー:

/** 
* Finds and displays a user entity. 
* 
* @Method("GET") 
* @Route("/{id}/", name="authenticated_user_show", requirements={"id": "\d+"}) 
* @ParamConverter("user", class="AppBundle:User") 
* @Security("is_granted('SHOW', user)") 
*/ 
public function showAction(User $user) 
{ 

そして投票者:

protected function voteOnAttribute($attribute, $subject, TokenInterface $token) 
{ 
    $user = $token->getUser(); 

    if (!$user instanceof User) { 
     // the user must be logged in; if not, deny access 
     return false; 
    } 

    if ($user->hasRole(User::ROLE_SUPER_ADMIN)) { 
     // if super admin, can do everything 
     return true; 
    } 

    // you know $subject is an User object, thanks to supports 
    /** @var User $userSubject */ 
    $userSubject = $subject; 

    switch ($attribute) { 
     case self::SHOW: 
      return $this->canShow($userSubject, $user); 
     case self::EDIT: 
      return $this->canEdit($userSubject, $user); 
    } 

    throw new \LogicException('This code should not be reached!'); 
} 


private function canShow(User $userSubject, User $user) : bool 
{ 
    if ($user->getClient() === $userSubject->getClient()) { 
     // if they are in the same client 
     return true; 
    } 

    return false; 
} 

private function canEdit(User $userSubject, User $user, TokenInterface $token) : bool 
{ 
    if (
     $this->decisionManager->decide($token, [User::ROLE_ADMIN]) && 
     $user->getClient() === $userSubject->getClient() 
     ) { 
     // if the user and the admin belong to the same client 
     return true; 
    } elseif (
     $this->decisionManager->decide($token, [User::ROLE_MANAGER]) && 
     $this->userManager->hasEstablishmentInCommon($user, $userSubject) 
     ) { 
     // if the user and the manager are linked to the same establishment 
     return true; 
    } 

    return false; 
} 
+0

あなたのコードはこれまでのところ大丈夫です。 $ this-> canShowと$ this-> canEditでユーザーの混乱を招かないことを再確認できますか? $ this-> canShow $ this-> canEditというコードを共有できますか? 私はたぶん$ loggedUserの$ userの名前を少し明確にするために名前を変更します – albert

+0

答えをありがとう、$ this-> canEdit()を表示するために質問を編集しました。 しかし、問題はどこか他の場所から来ています。なぜなら、私が 'dump($ user)'と 'dump($ userSubject)'をvoteOnAttribute関数で実行すると、両方とも現在ログインしているユーザーだからです。 – Theolephant

答えて

0

あなたは私はあなたがセキュリティアノテーション内の変数との競合を持っていることを検討しますログインしているユーザーを確認しようとしていないと仮定すると、コンテキスト:

https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/security.html セキュリティアノテーションは、次の変数にアクセスできます。

  • トークン:トークンの現在のセキュリティ
  • ユーザ:現在のユーザオブジェクト
  • リクエスト:リクエストインスタンス
  • ロール:ユーザーの役割。すべての要求は 属性です。

修正するには、競合を避けるためにユーザーの名前を変更します。

/** 
* Finds and displays a user entity. 
* 
* @Method("GET") 
* @Route("/{id}/", name="authenticated_user_show", requirements={"id": 
    "\d+"}) 
* @ParamConverter("showUser", class="AppBundle:User") 
* @Security("is_granted('SHOW', showUser)") 
*/ 
public function showAction(User $showUser) 
関連する問題