我正在尝试实施额外的身份验证层,目的是仅在用户具有特定状态时对其进行身份验证。 如果状态不同,我想显示自定义登录错误(您的帐户已被暂停),并且根本不对用户进行身份验证,类似于凭据错误,但使用不同的错误消息时发生的情况。
到目前为止,我尝试了两种选择:
我在侦听器中添加了一个检查“InteractiveLoginEvent”的检查。在这里我可以检查用户状态并设置一个flash错误消息,但是我没有看到重定向到登录页面的正确方法是什么,因为这个事件没有响应方法,除了使用header()调用我绝对是我想避免。
我实现了一个自定义选民,将“access_decision_manager”startegy设置为“unanimous”,如果状态不允许用户进行身份验证,则返回“ACCESS_DENIED”。到目前为止,用户无法访问资源,但我发现他仍然经过身份验证。而且我绝对不希望这样。
我不确定我是否遗漏了某些东西,或者我是否朝着错误的方向前进。
答案 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!');
}
}