Я создал пользовательский AuthenticationProvider
для выполнения пользовательских проверок безопасности. Я также создал пользовательские исключения, которые унаследованы от AccountStatusException
, чтобы уведомлять о проблемах со статусом пользователя, например, когда пользователь не подтвердил свою учетную запись в течение определенного периода времени. Мой UserDetails
также является пользовательской реализацией.
Вот код проверки безопасности, которую я выполняю. Код, не имеющий отношения к делу, опущен.
public class SsoAuthenticationProvider implements AuthenticationProvider {
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = (String) authentication.getPrincipal();
User user = null;
if (username != null) {
user = getUserRepository().findByUserName(username);
if (user != null) {
if (user.getEnabled() != 0) {
if ((user.getUserDetail().getConfirmed() != 0)
|| ((new Date().getTime() - user.getUserDetail().getRequestDate().getTime()) / (1000 * 60 * 60 * 24)) <= getUnconfirmedDays()) {
if (getPasswordEncoder().isPasswordValid(user.getPassword(),
(String) authentication.getCredentials(), user)) {
user.authenticated = true;
user.getAuthorities();
}
} else {
throw new UserNotConfirmedAndTimeExceeded(
"User has not been cofirmed in the established time period");
}
} else {
throw new DisabledException("User is disabled");
}
} else {
throw new BadCredentialsException("User or password incorrect");
}
} else {
throw new AuthenticationCredentialsNotFoundException("No credentials found in context");
}
return user;
}
}
SsoAuthenticationProvider
проверяет:
. Проблема в том, что не все эти исключения выбрасываются вверх по стеку до контроллера, поэтому кажется невозможным сообщить пользователю о проблеме входа.
Использование UserDetails
методов, таких какisEnabled()
(и подобное )невозможно, поскольку семантика наших различных статусов учетных записей пользователей совершенно различна.
Является ли это правильным подходом для создания пользовательской безопасности с пользовательскими исключениями? Должен ли я реализовать что-то еще, чтобы это сработало?