Рубрики
Без рубрики

Spring Security: Аутентификация с помощью службы UserDetailsService, поддерживаемой базой данных

Краткое руководство по созданию пользовательского сервиса UserDetailsService с поддержкой базы данных для проверки подлинности с помощью Spring Security.

Автор оригинала: Loredana Crusoveanu.

1. Обзор

В этой статье мы покажем, как создать пользовательскую базу данных UserDetailsService для аутентификации с помощью Spring Security.

2. UserDetailsService

Интерфейс UserDetailsService используется для извлечения данных, связанных с пользователем. У него есть один метод с именем loadUserByUsername () , который можно переопределить, чтобы настроить процесс поиска пользователя.

Он используется DaoAuthenticationProvider для загрузки сведений о пользователе во время аутентификации.

3. Модель Пользователя

Для хранения пользователей мы создадим сущность User , сопоставленную с таблицей базы данных, со следующими атрибутами:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    private String password;

    // standard getters and setters
}

4. Получение пользователя

Для получения пользователя, связанного с именем пользователя, мы создадим класс DAO , используя Spring Data , расширив интерфейс JpaRepository :

public interface UserRepository extends JpaRepository {

    User findByUsername(String username);
}

5. Служба UserDetailsService

Чтобы предоставить наш собственный пользовательский сервис, нам нужно будет реализовать интерфейс UserDetailsService .

Мы создадим класс с именем MyUserDetailsService , который переопределяет метод loadUserByUsername() интерфейса.

В этом методе мы извлекаем объект User с помощью DAO , и если он существует , оберните его в объект MyUserPrincipal , который реализует UserDetails и возвращает его:

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);
        }
        return new MyUserPrincipal(user);
    }
}

Давайте определим класс MyUserPrincipal следующим образом:

public class MyUserPrincipal implements UserDetails {
    private User user;

    public MyUserPrincipal(User user) {
        this.user = user;
    }
    //...
}

6. Конфигурация пружины

Мы продемонстрируем оба типа конфигураций Spring: XML и основанные на аннотациях, которые необходимы для использования нашей пользовательской UserDetailsService реализации.

6.1. Настройка аннотаций

Все, что нам нужно сделать, чтобы наши клиенты могли UserDetailsService это добавить его в контекст нашего приложения в качестве компонента.

Поскольку мы настроили наш класс с аннотацией @Service , приложение автоматически обнаружит его во время сканирования компонентов и создаст компонент из этого класса. Поэтому нам больше ничего не нужно здесь делать.

В качестве альтернативы мы можем:

  • настройте его в менеджере аутентификации с помощью метода AuthenticationManagerBuilder#UserDetailsService
  • установите его в качестве свойства в пользовательском поставщике аутентификации bean, а затем введите его с помощью функции AuthenticationManagerBuilder# AuthenticationProvider

6.2. Конфигурация XML

С другой стороны, для конфигурации XML нам нужно определить компонент с типом MyUserDetailsService и внедрить его в компонент Spring authentication-provider :




    
        
        
    

    

    

7. Другие Параметры Аутентификации с поддержкой Базы Данных

AuthenticationManagerBuilder предлагает еще один метод настройки аутентификации на основе JDBC в нашем приложении.

Нам нужно будет настроить аутентификацию AuthenticationManagerBuilder.jdbc с помощью источника данных экземпляра. Если наша база данных следует схеме пользователя Spring , то конфигурации по умолчанию нам подойдут.

Мы видели базовую конфигурацию, использующую этот подход, в предыдущем посте .

Сущность JdbcUserDetailsManager , полученная в результате этой конфигурации, также реализует UserDetailsService .

В результате мы можем сделать вывод, что эту конфигурацию легче реализовать, особенно если мы используем Spring Boot, который автоматически настраивает источник данных для нас.

В любом случае, если нам нужен более высокий уровень гибкости, чтобы точно настроить, как приложение будет получать данные пользователя, мы выберем подход, которому мы следовали в этом руководстве.

8. Заключение

Подводя итог, в этой статье мы показали, как создать пользовательский Spring-сервис UserDetailsService , поддерживаемый постоянными данными.

Реализацию можно найти в проекте GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.