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

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

1. обзор

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

2. UserDetailsServiceс

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

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

3. МодельUser

Для хранения пользователей мы создадим объект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 , - это добавить его в контекст нашего приложения как bean-компонент.

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

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

  • настроить его вauthenticationManager, используя методAuthenticationManagerBuilder#userDetailsService

  • установите его как свойство в пользовательском bean-компонентеauthenticationProvider, а затем введите его с помощью функцииAuthenticationManagerBuilder# authenticationProvider

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

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




    
        
        
    



    

7. Другие варианты аутентификации на основе базы данных

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

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

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

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

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

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

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

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

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

Related