将 Spring Security 与 JPA 结合使用

2022-09-03 04:53:35

我是春天的新手。

我们正在使用弹簧安全功能。数据库连接:JPA的eclipselink实现。数据库:MySql

在使用弹簧安全性时,身份验证提供程序的配置如下,-

<authentication-provider>

    <jdbc-user-service id="userDetailsService" data-source-ref="Datasource" />

    </authentication-provider>

但是在JPA中,我们不定义数据源,我们使用持久性单元和提供者jpa.PersistenceProvider.

那么,我们如何配置身份验证提供程序,以便使用 JPA 进行数据库连接呢?

数据源引用字段究竟应该包含哪些内容才能使用数据库进行身份验证?

提前感谢您。


答案 1

基本上,您可能需要自己实现用户详细信息服务

例如,您将拥有一个实体,而您的 UserDetailsService 实现将查找用户并将其转换为 UserDetails 对象(或者您的实体必须实现 )。UserUserDetails

示例实现:

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.UserDetailsServiceUserDetails 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>

推荐