将 Spring Security 与 JPA 结合使用

Posted

技术标签:

【中文标题】将 Spring Security 与 JPA 结合使用【英文标题】:Use Spring Security with JPA 【发布时间】:2011-05-28 05:51:33 【问题描述】:

我是 Spring 新手。

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

使用spring security时,认证提供者的配置如下,-

<authentication-provider>

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

    </authentication-provider>

但是在 JPA 中我们没有定义数据源,我们使用 Persistence 单元和提供者jpa.PersistenceProvider.

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

data-source-ref 字段究竟应该包含什么才能使用数据库进行身份验证?

提前谢谢你。

【问题讨论】:

【参考方案1】:

基本上你可能需要implement UserDetailsService yourself。

例如,您将拥有一个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>

【讨论】:

您的自定义 UserDetailsS​​ervice 将使用 JPA(和您的数据库架构)来创建 UserDetails 对象。 嗯,是的,我认为这很明显:-) 我的意思当然是 UserDetailsS​​ervice,而不是 AuthenticationUserDetailsS​​ervice 您好,感谢您的回复,但是我如何自定义 userdetail 服务。任何参考代码都会有所帮助。谢谢大家 @Sean Patrick Floyd:您能否为“使用 jpa 的 Spring 安全性”推荐任何教程或有用的链接,或者您能否展示“userDetails 类的实现方法在 User 类中的外观?”【参考方案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>

【讨论】:

这是最好的答案 - IMO

以上是关于将 Spring Security 与 JPA 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证

Spring、Spring Security、JPA、MySQL、Hibernate 配置

Spring Security + JPA 用户模式

Spring Security JDBC 和 Hibernate JPA

Spring Security 3.1 + JPA - 空指针异常

实现 Spring Security UserDetails 的 JPA 实体的含义是啥?