2013-09-11 4 views
1

Я пытаюсь реализовать дополнительный уровень аутентификации с целью аутентификации пользователя, только если у него есть определенный статус. Если статус отличается, я хочу показать пользовательскую регистрационную ошибку (ваша учетная запись была приостановлена) и не аутентифицировать пользователя вообще, подобно тому, что происходит, если учетные данные неверны, но с другим сообщением об ошибке.Дополнительные критерии проверки подлинности

До сих пор я пытался два варианта:

  1. Я добавил проверку внутри слушателя, который проверяет для «InteractiveLoginEvent». Здесь я могу проверить состояние пользователя и установить сообщение об ошибке флэш-памяти, но я не вижу, как правильно перенаправить обратно на страницу входа, поскольку это событие не имеет метода ответа, кроме использования вызова header(), который я определенно хочу избежать.

  2. Я внедрил пользовательский избиратель, установил «access_decision_manager» startegy на «единодушный» и вернул «ACCESS_DENIED», если статус не позволяет пользователю пройти аутентификацию. Пока что так хорошо, пользователь не может получить доступ к ресурсам, но я вижу, что он все еще получает аутентификацию. И я определенно этого не хочу.

Я не уверен, если я что-то упустил или если я пойду в неправильном направлении.

ответ

0

Поскольку symfony 2 дает четкую разницу между аутентификацией и авторизацией, похоже, что вариант 2) связан с авторизацией, поэтому вариант 1) более подходит.

Так среди слушателей «InteractiveLoginEvent» Я просто добавил надлежащую проверку на статус пользователя и бросали следующее исключение мне удалось реализовать свою функциональность по мере необходимости:

бросить новый AuthenticationException («приостановить сообщение об ошибке») ;

Так что слушатель выглядит примерно так:

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!'); 
    } 
} 
Смежные вопросы