【问题标题】:Spring - Extending classes with hibernate and spring securitySpring - 使用休眠和弹簧安全扩展类
【发布时间】: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 如何处理扩展类?我仍然可以在大型用户存储库中拥有学生和教师吗?春季安全如何与此一起工作?

谢谢

【问题讨论】:

    标签: java mysql spring hibernate spring-security


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 2012-07-04
      • 2011-08-09
      • 2016-07-09
      • 2016-11-04
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      相关资源
      最近更新 更多