【问题标题】:Use Spring Security with JPA将 Spring Security 与 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 字段究竟应该包含什么才能使用数据库进行身份验证?

提前谢谢你。

【问题讨论】:

    标签: java spring jpa spring-mvc spring-security


    【解决方案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
    猜你喜欢
    • 2015-12-09
    • 2011-12-20
    • 2016-03-04
    • 2019-11-18
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多