簡體   English   中英

將Spring Security與JPA一起使用

[英]Use Spring Security with JPA

我是Spring的新手。

我們正在使用彈簧安全功能。 數據庫連接:JPA的eclipselink實現。 數據庫:MySql

在使用spring security時,身份驗證提供程序的配置如下, -

<authentication-provider>

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

    </authentication-provider>

但是在JPA中我們沒有定義數據源,我們使用持久性單元和提供者jpa.PersistenceProvider.

那么我們如何配置身份驗證提供程序以便使用JPA進行數據庫連接?

data-source-ref字段究竟應該包含什么才能使用數據庫進行身份驗證?

先感謝您。

基本上你可能需要自己實現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>

在您的情況下,更簡單的身份驗證方法是讓您的一個服務層類實現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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM