Symfony 4选民验证用户已通过完全认证

时间:2018-09-10 23:24:59

标签: symfony symfony4

在进行Voter检查以验证用户实际登录时,是否有更简便的方法(或更好的替代方法)?

示例:

protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
    switch ($attribute) {
        case self::VIEW:
            return $this->canView($subject, $token);
        case self::EDIT:
            return $this->canEdit($subject, $token);
        case self::CREATE:
            return $this->canCreate($token);
    }
}

/**
 * @param TokenInterface $token
 * @return bool
 */
private function canCreate(TokenInterface $token)
{
    if (!$token->getUser() instanceof User)
    {
        return false;
    }
    if ($token->getUser()->isEnabled() && !$token->getUser()->isFreeze())
    {
        return true;
    }
    return false;
}

我遇到的问题来自$token->getUser(),当用户匿名时返回一个字符串。而不是实际的用户实体。

使用$this->isGranted('IS_AUTHENTICATED_FULLY')可以很容易地在控制器内完成此操作,我只是觉得自己缺少在选民中可以完成的类似操作。

1 个答案:

答案 0 :(得分:3)

您可以将AuthorizationChecker注入投票者,然后进行isGranted()检查。

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class MyVoter
{
    private $authChecker;

    public function __construct(AuthorizationCheckerInterface $authChecker)
    {
        $this->authChecker = $authChecker;
    }

    private function canCreate(TokenInterface $token)
    {
        if (!$this->authChecker->isGranted('IS_FULLY_AUTHENTICATED')) {
            return false;
        }
        // ...
    }
}