Spring Security: Удостоверяване с подкрепена с база данни UserDetailsService

1. Общ преглед

В тази статия ще покажем как да създадете потребителско обезпечено UserDetailsService, подкрепено с база данни, за удостоверяване с Spring Security.

2. UserDetailsService

Интерфейсът UserDetailsService се използва за извличане на данни, свързани с потребителя. Той има един метод, наречен loadUserByUsername (), който може да бъде заменен, за да персонализирате процеса на намиране на потребителя.

Той се използва от DaoAuthenticationProvider за зареждане на подробности за потребителя по време на удостоверяване.

3. Потребителският модел

За съхраняване на потребители ще създадем потребителски обект, който се съпоставя с таблица на базата данни, със следните атрибути:

@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 () на интерфейса.

В този метод извличаме потребителския обект с помощта на 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 , приложението автоматично ще го открие по време на сканиране на компоненти и ще създаде боб от този клас. Следователно тук не трябва да правим нищо друго.

Като алтернатива можем:

  • конфигурирайте го в authenticationManager с помощта на метода AuthenticationManagerBuilder # userDetailsService
  • да го настроите като имот в персонализиран authenticationProvider боб, а след това се инжектира, че използването на AuthenticationManagerBuilder # authenticationProvider функция

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

От друга страна, за XML конфигурацията трябва да дефинираме боб с тип MyUserDetailsService и да го инжектираме в боб на доставчика за удостоверяване на Spring :

7. Други опции за удостоверяване, подкрепени с база данни

На AuthenticationManagerBuilder оферти един друг метод, за да изберете JDBC-базирано идентифициране на нашата молба.

Ще трябва да конфигурираме AuthenticationManagerBuilder.jdbcAuthentication с екземпляр DataSource . Ако нашата база данни следва Spring User Schema, тогава конфигурациите по подразбиране ще ни подхождат добре.

Виждали сме основна конфигурация, използваща този подход в предишна публикация.

Обектът JdbcUserDetailsManager , резултат от тази конфигурация, също реализира UserDetailsService .

В резултат на това можем да заключим, че тази конфигурация е по-лесна за изпълнение, особено ако използваме Spring Boot, която автоматично конфигурира DataSource вместо нас.

Ако все пак се нуждаем от по-високо ниво на гъвкавост, като персонализираме как точно приложението ще извлича потребителските подробности, тогава ще изберем подхода, който следвахме в този урок.

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

В обобщение, в тази статия показахме как да създадем персонализиран Spring-based UserDetailsService, подкрепен от постоянни данни.

Реализацията може да бъде намерена в проекта GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.