将 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>
【讨论】:
您的自定义 UserDetailsService 将使用 JPA(和您的数据库架构)来创建 UserDetails 对象。 嗯,是的,我认为这很明显:-) 我的意思当然是 UserDetailsService,而不是 AuthenticationUserDetailsService 您好,感谢您的回复,但是我如何自定义 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 JDBC 和 Hibernate JPA