Symfony UserVoter获取url中当前登录的用户而不是用户

Symfony UserVoter获取url中当前登录的用户而不是用户,symfony,symfony-3.2,symfony2-voter,Symfony,Symfony 3.2,Symfony2 Voter,在显示用户操作中,我想检查已登录的用户是否有权查看此用户。所以我创建了一个UserVoter。 但是,当我尝试使用注释将url中定义的用户传递给投票者时,我使用$subject和$token->getUser() 如果我在操作中更改我的var名称,它可以正常工作($user->$foo) 你知道我怎么做才能不改变我的变量名吗 控制器: /** * Finds and displays a user entity. * * @Method("GET") * @Route("/{id}/",

在显示用户操作中,我想检查已登录的用户是否有权查看此用户。所以我创建了一个UserVoter。 但是,当我尝试使用注释将url中定义的用户传递给投票者时,我使用
$subject
$token->getUser()

如果我在操作中更改我的var名称,它可以正常工作($user->$foo)

你知道我怎么做才能不改变我的变量名吗

控制器:

/**
 * 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;
}

假设您没有试图查看已登录的用户,我将认为您可能与安全注释上下文中的变量冲突:

安全批注可以访问以下变量:

  • 令牌:当前安全令牌
  • 用户:当前用户对象
  • 请求:请求实例
  • 角色:用户角色;所有要求 属性
要修复此问题,请更改用户的名称,以避免冲突

/**
 * 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)

到目前为止,您的代码看起来还不错。您能否再次检查您是否混淆了用户(参数在$this->canShow和$this->canEdit上的顺序)?你能分享代码$this->canShow$this->canEdit吗?我可能会将$user重命名为$loggedUser以澄清一点谢谢你的回答,我已经编辑了这个问题以向你展示$this->canEdit()。但问题来自其他地方,因为当我在voteOnAttribute函数中执行
dump($user)
dump($userSubject)
时,两者都是当前登录的用户。