Spring - 使用休眠和弹簧安全扩展类

Posted

技术标签:

【中文标题】Spring - 使用休眠和弹簧安全扩展类【英文标题】:Spring - Extending classes with hibernate and spring security 【发布时间】:2017-07-19 21:22:28 【问题描述】:

我想要一个用户类、一个学生类和一个教师类。随着学生和教师类扩展用户。使用 Hibernate 和 Spring Security 执行此操作的最佳方法是什么。目前,我有预期字段的用户,并且:

@OneToOne(cascade=CascadeType.ALL)
@JoinTable(name="user_roles",
           joinColumns = @JoinColumn(name="user_id", referencedColumnName="id"),
           inverseJoinColumns = @JoinColumn(name="role_id", referencedColumnName="id"))
           private Role role;

帮助弹簧安全。仅使用用户一切正常,但现在我正在尝试扩展用户类,但我真的不知道如何开始。 hibernate 如何处理扩展类?我仍然可以在大型用户存储库中拥有学生和教师吗?春季安全如何与此一起工作?

谢谢

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您希望 Spring Security 的 UserDetailsS​​ervice 实现适用于您的 User、Teacher、Student 实例。

要实现这一点,您可以使用 Hibernate 继承支持和多态查询来获取用户信息。

Hibernate 有几种表示继承的策略(映射超类单表联表每个类的表):http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance

Mapped Superclass 不适合,因为它不支持多态查询。其他 3 个。

在您的 UserDetailsS​​ervice 实现中,您可以执行类似的操作

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
    User user = (User) getHibernateTemplate().execute(new HibernateCallback() 
        public Object doInHibernate(Session session)
                throws HibernateException, SQLException 
            Query query = session.createQuery("select u from User u where login = ?");
            query.setParameter(0, username);
            return query.uniqueResult();
        
    );
    if (user == null) 
        throw new UsernameNotFoundException("Unauthorized");
    

    // ... usual password check follows...

    // ... create UserDetails as usual

【讨论】:

以上是关于Spring - 使用休眠和弹簧安全扩展类的主要内容,如果未能解决你的问题,请参考以下文章

休眠+弹簧+Tomcat

弹簧或休眠连接泄漏

如何在休眠/弹簧中更新多对多集合(延迟加载)?

在 Spring Boot 应用程序中未针对休眠和弹簧过滤 Log4j2 日志级别

休眠和弹簧持久性问题。可能的身份值没有增加?

使用休眠和弹簧更新