Ответ 1
В большинстве случаев, когда используются только имена пользователей и пароли для аутентификации и роли для авторизации, достаточно реализовать собственный UserDetailsService.
Поток аутентификации пароля имени пользователя обычно выглядит следующим образом:
- Фильтр безопасности spring (базовая аутентификация/форма/..) подбирает имя пользователя и пароль, превращает его в объект UsernamePasswordAuthentication и передает его в AuthenticationManager
- Менеджер проверки подлинности ищет поставщика-кандидата, который может обрабатывать UsernamePasswordtokens, который в этом случае является DaoAuthenticationProvider и передает маркер для аутентификации
- Поставщик аутентификации вызывает интерфейс loadUserByUsername метода и генерирует исключение UsernameNotFound, если пользователь отсутствует или возвращает объект UserDetails, который содержит имя пользователя, пароль и полномочия.
- Поставщик Authentication затем сравнивает пароли предоставленного объекта UserPasswordToken и UserDetails. (он также может обрабатывать хэши паролей через PasswordEncoders). Если он не совпадает, аутентификация завершается с ошибкой. Если он соответствует ему, регистрирует объект детали пользователя и передает его в AccessDecisionManager, который выполняет часть авторизации.
Итак, если проверка в DaoAuthenticationProvider соответствует вашим потребностям. Тогда вам нужно будет только реализовать свой собственный UserDetailsService и настроить проверку DaoAuthenticationProvider.
Пример для UserDetailsService с использованием spring 3.1 выглядит следующим образом:
Spring XML:
<security:authentication-manager>
<security:authentication-provider user-service-ref="myUserDetailsService" />
</security:authentication-manager>
<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" />
Реализация UserDetailsService:
public MyUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//Retrieve the user from wherever you store it, e.g. a database
MyUserClass user = ...;
if (user == null) {
throw new UsernameNotFoundException("Invalid username/password.");
}
Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3");
return new User(user.getUsername(), user.getPassword(), authorities);
}
}