【问题标题】:Hibernate + Spring Security休眠+弹簧安全
【发布时间】:2012-01-22 09:20:23
【问题描述】:

我正在使用 spring 3 + spring security 3 + hibernate。 我对映射类有一些问题。我不知道为什么,但是有些类是映射的,它们可以被 Hibernate 使用,但同时一些(用于 Spring Security)不是! 论坛-security.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>
<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService"/>
</authentication-manager>
</beans:beans>

UserServiceImpl:

package forum.service;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import forum.domain.ForumUser;

@Service
public class UserServiceImpl implements UserService{
    @Autowired private SessionFactory sessionFactory;
@Autowired private Assembler assembler;
public List<ForumUser> listAllUsers(){
    return null;
}
public List<ForumUser> listUsersBySellingPont(){
    return null;
}
@Transactional
public ForumUser getUserByUsername(String username){
    Session session = sessionFactory.getCurrentSession();
    List<ForumUser> users = session.createQuery("from ForumUser").list();
    ForumUser result = null;
    for(ForumUser user : users){
        if(user.getUsername().equals(username))
            result = user;
    }
    return result;
}
public void addUser(ForumUser user){

}
public void updateUser(ForumUser user){

}
public void deleteUser(Integer id){

}
}

汇编器:

package forum.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import forum.domain.ForumUser;
import forum.domain.UserDetailsImpl;

@Service("assembler")
public class Assembler {
@Transactional(readOnly = true)
  UserDetailsImpl buildUserFromUserEntity(ForumUser userEntity) {
    Integer id = userEntity.getId();
    String username = userEntity.getUsername();
    String password = userEntity.getPassword();
    String email = userEntity.getEmail();
    Date enabled = userEntity.getEnabled();
    Date lastEntered = userEntity.getLastEntered();
    Date registered = userEntity.getRegistered();

    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    for (GrantedAuthority role : userEntity.getAuthorities()) {
      authorities.add(role);
    }
    UserDetailsImpl user = new UserDetailsImpl();
    user.setId(id);
    user.setUsername(username);
    user.setPassword(password);
    user.setEmail(email);
    user.setEnabled(enabled);
    user.setAuthorities(authorities);
    user.setLastEntered(lastEntered);
    user.setRegistered(registered);
    return user;
  }
}

现在没有被hibernate映射的类(其他类被映射):

package forum.domain;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.FetchType;
import javax.persistence.CascadeType;

import org.springframework.security.core.GrantedAuthority;

@Entity
@Table(name="users")
public class ForumUser {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
@Column(name="email")
private String email;
@Column(name="registered")
private Date registered;
@Column(name="lastEntered")
private Date lastEntered;
@Column(name="enabled")
private Date enabled;
@OneToMany(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY,mappedBy="forumUser")
private List<GrantedAuthority> authorities;
public Date getEnabled(){
    return enabled;
}
public void setEnabled(Date enabled){
    this.enabled = enabled;
}
public Integer getId(){
    return id;
}
public void setId(Integer id){
    this.id = id;
}
public String getUsername(){
    return username;
}
public void setUsername(String username){
    this.username = username;
}
public String getPassword(){
    return password;
}
public void setPassword(String password){
    this.password = password;
}
public String getEmail(){
    return email;
}
public void setEmail(String email){
    this.email = email;
}
public Date getRegistered(){
    return registered;
}
public void setRegistered(Date registered){
    this.registered = registered;
}
public Date getLastEntered(){
    return lastEntered;
}
public void setLastEntered(Date lastEntered){
    this.lastEntered = lastEntered;
}
public List<GrantedAuthority> getAuthorities() {
    return authorities;
}
public void setAuthorities(List<GrantedAuthority> authorities){
    this.authorities = authorities;
}
}

还有二等:

package forum.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.persistence.CascadeType;
import javax.persistence.JoinColumn;
import javax.persistence.Table;

import org.springframework.security.core.GrantedAuthority;

@Entity
@Table(name="authorities")
public class Authority implements GrantedAuthority{
@ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
@JoinColumn(name="userId")
private ForumUser forumUser;
@Column(name="authority")
private String authority;
public String getAuthority() {
    return authority;
}
public void setAuthority(String authority) {
    this.authority = authority;
}
}

因此,当我尝试通过数据库中的用户名(来自 ForumUser 的 UserServiceImpl.getUserByUsername())检索用户时,它会抛出 org.hibernate.hql.ast.QuerySyntaxException:ForumUser 未映射 [来自 ForumUser]

如果我将其 HQL 更改为另一个,例如“来自论坛”(它是另一个类,正在工作),它将引发另一个异常,实际上并不重要,但事实是它映射了另一个类并可以检索它。 我该如何解决这个问题?

【问题讨论】:

  • 它看起来像一个休眠相关问题:请发布 Thema hibernate / ja 相关配置。

标签: security hibernate spring annotations mapping


【解决方案1】:

哦,我找到了解决办法!这一切都是因为我自己的疏忽。我忘记在我的配置文件中将新类添加到带注释的持久类列表中。

【讨论】:

  • 也许你应该删除这个问题,或者至少减少mahoosive代码示例。
猜你喜欢
  • 2012-07-04
  • 2016-11-04
  • 2017-07-19
  • 2020-03-13
  • 1970-01-01
  • 2011-08-09
  • 2015-12-14
  • 1970-01-01
  • 2012-05-15
相关资源
最近更新 更多