Проверьте дополнительные параметры с помощью Spring Security

1


Пожалуйста, дайте подсказку в Spring Security, как я могу проверить дополнительные параметры во время входа в систему.
Например, чтобы проверить не только "имя пользователя" и "пароль", но также, если он подтвердил свою регистрацию по электронной почте;
Все данные хранятся в БД, и я могу легко получить его с моей реализацией UserDetailsService;
Но как заставить службу безопасности обратить внимание на дополнительный параметр "isValidated"?
Сейчас я использую Spring 3.2.0;

Теги:
spring-security
spring

1 ответ

1
Лучший ответ

Один из способов добиться этого - создать пользовательский AuthenticationProvider или расширить существующий. В вашем случае может быть достаточно расширить, например, DaoAuthenticationProvider и поставить логику для проверки того, подтверждена ли учетная запись в методе additionalAuthenticationChecks().

Вот пример:

public class CustomAuthenticationProvider extends DaoAuthenticationProvider {

    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
        // Perform the checks from the super class
        super.additionalAuthenticationChecks(userDetails, authentication);

        // Cast the UserDetails to the implementation you use
        User user = (User) userDetails;

        // Check the confirmed status
        if (!user.isAccountConfirmed()) {
            throw new AccountNotConfirmedException("Account is not confirmed yet.");
        }
    }

    public static class AccountNotConfirmedException extends AuthenticationException {
        public AccountNotConfirmedException(String message) {
            super(message);
        }
    }

}

Ваша реализация UserDetails должна содержать информацию о состоянии подтверждения учетной записи. Вы можете сопоставить эту информацию в своей реализации UserDetailsService.

Вариант 2

Изменение: теперь, когда я смотрю на это, первое решение немного сложнее. Вы можете легко решить эту проблему без использования пользовательского AuthenticationProvider. Просто убедитесь, что isEnabled() вашей реализации UserDetails возвращает false если учетная запись не подтверждена. Если enabled свойство является false аутентификация не будет разрешена (об этом автоматически заботится Spring Security).

Первое решение может быть полезно, если вы хотите явно обработать AccountNotConfirmedException в AuthenticationFailureHandler например.

  • 0
    Работает отлично. Спасибо!
  • 0
    @Asprelis Нет проблем :), кстати, я только что обновил ответ с более простым решением ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню