额外的认证标准

时间:2013-09-11 12:20:38

标签: authentication symfony symfony-2.2

我正在尝试实施额外的身份验证层,目的是仅在用户具有特定状态时对其进行身份验证。 如果状态不同,我想显示自定义登录错误(您的帐户已被暂停),并且根本不对用户进行身份验证,类似于凭据错误,但使用不同的错误消息时发生的情况。

到目前为止,我尝试了两种选择:

  1. 我在侦听器中添加了一个检查“InteractiveLoginEvent”的检查。在这里我可以检查用户状态并设置一个flash错误消息,但是我没有看到重定向到登录页面的正确方法是什么,因为这个事件没有响应方法,除了使用header()调用我绝对是我想避免。

  2. 我实现了一个自定义选民,将“access_decision_manager”startegy设置为“unanimous”,如果状态不允许用户进行身份验证,则返回“ACCESS_DENIED”。到目前为止,用户无法访问资源,但我发现他仍然经过身份验证。而且我绝对不希望这样。

  3. 我不确定我是否遗漏了某些东西,或者我是否朝着错误的方向前进。

1 个答案:

答案 0 :(得分:0)

由于symfony 2在身份验证和授权之间明显不同,因此选项2)与授权相关,因此选项1)更适合。

因此,在“InteractiveLoginEvent”监听器中,我刚刚添加了对用户状态的正确检查,并抛出了以下异常,我设法根据需要实现了我的功能:

抛出新的AuthenticationException('suspend error message');

所以听众看起来像这样:

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{        
    if ($this->securityContext->isGranted('ROLE_CUSTOMROLE')) {
        $user = $this->securityContext->getToken()->getUser();
        // ... check for the user status here

        throw new AuthenticationException('Your account has been suspended!');
    }
}