表示ユーザーアクションでは、ログオンユーザーにこのユーザーを表示する権利があるかどうかを確認したいと思います。だから私は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;
}
あなたのコードはこれまでのところ大丈夫です。 $ this-> canShowと$ this-> canEditでユーザーの混乱を招かないことを再確認できますか? $ this-> canShow $ this-> canEditというコードを共有できますか? 私はたぶん$ loggedUserの$ userの名前を少し明確にするために名前を変更します – albert
答えをありがとう、$ this-> canEdit()を表示するために質問を編集しました。 しかし、問題はどこか他の場所から来ています。なぜなら、私が 'dump($ user)'と 'dump($ userSubject)'をvoteOnAttribute関数で実行すると、両方とも現在ログインしているユーザーだからです。 – Theolephant