Пожалуйста, дайте подсказку в Spring Security, как я могу проверить дополнительные параметры во время входа в систему.
Например, чтобы проверить не только "имя пользователя" и "пароль", но также, если он подтвердил свою регистрацию по электронной почте;
Все данные хранятся в БД, и я могу легко получить его с моей реализацией UserDetailsService;
Но как заставить службу безопасности обратить внимание на дополнительный параметр "isValidated"?
Сейчас я использую Spring 3.2.0;
Один из способов добиться этого - создать пользовательский 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
.
Изменение: теперь, когда я смотрю на это, первое решение немного сложнее. Вы можете легко решить эту проблему без использования пользовательского AuthenticationProvider
. Просто убедитесь, что isEnabled()
вашей реализации UserDetails
возвращает false
если учетная запись не подтверждена. Если enabled
свойство является false
аутентификация не будет разрешена (об этом автоматически заботится Spring Security).
Первое решение может быть полезно, если вы хотите явно обработать AccountNotConfirmedException
в AuthenticationFailureHandler
например.