Как реализовать пользовательскую проверку подлинности в Spring Security 3?

Я знаю, что на это ответили так много раз, но я смущен. У меня уже есть механизм аутентификации в моем приложении, и я просто хочу использовать часть авторизации Spring MVC. Я использую Spring MVC 3 и Spring Security 3.

Когда я выполнял поиск в Интернете, я нашел два решения, первое - просто реализовать интерфейс аутентификацииProvider. Пример1. Второй заключается в реализации UserDetails и UserDetailsService, Example2, поэтому я потерялся здесь.

---- Обновление ----

Вторая часть вопроса здесь. И решение обходного пути.

Ответы

Ответ 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);
}

}