Использовать Spring Безопасность с JPA
Я новичок в Spring.
Мы используем функцию защиты spring.
Подключение к базам данных: реализация Eclipelink JPA.
База данных: MySql
При использовании защиты spring Конфигурация поставщика проверки подлинности выглядит следующим образом:
<authentication-provider>
<jdbc-user-service id="userDetailsService" data-source-ref="Datasource" />
</authentication-provider>
Но в JPA мы не определяем источник данных, мы используем модуль Persistence с провайдером jpa.PersistenceProvider.
Итак, как мы настраиваем поставщик проверки подлинности, чтобы использовать JPA для подключения к базе данных?
Что именно должно содержать поле data-source-ref для использования базы данных для аутентификации?
Спасибо заранее.
Ответы
Ответ 1
В основном вам, вероятно, нужно реализовать UserDetailsService
самостоятельно.
Таким образом, у вас есть, например, объект User
, и ваша реализация UserDetailsService
будет искать пользователя и преобразовывать его в UserDetails
объект (или ваш объект должен реализовать UserDetails
).
Пример реализации:
public class MyUserDetailsService implements UserDetailsService{
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager newEm){
this.entityManager = newEm;
}
public UserDetails loadUserByUsername(String username){
// assuming that you have a User class that implements UserDetails
return entityManager.createQuery("from User where username = :username", User.class)
.setParameter("username", username)
.getSingleResult();
}
}
И вы добавите это пользователю spring-security.xml
<authentication-manager>
<authentication-provider user-service-ref="MyUserDetailsService" />
</authentication-manager>
Ответ 2
Более простой способ аутентификации в вашем случае - это получить один из классов уровня обслуживания, реализующий интерфейс org.springframework.security.core.userdetails.UserDetailsService
. Этот интерфейс содержит только один метод UserDetails loadUserByUsername(String username)
. Вы должны убедиться, что вы вернете экземпляр UserDetails
для данного имени пользователя.
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
// load and return user using your regular JPA techniques here
...
}
После того как вы внедрили этот метод в свой класс обслуживания, вам просто нужно добавить ссылку на свой файл конфигурации spring:
<authentication-manager>
<authentication-provider user-service-ref="myServiceLayerClassInstance">
</authentication-provider>
</authentication-manager>