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, поэтому его должно быть легко импортировать и запускать как есть.