2017-06-09 20 views
0

问题是,h2只存储我的类User的属性,但未能存储来自Spring Security的User类的属性用户名,密码和权限。H2不存储用户名,密码和角色

这里是我的用户类:

package com.netcetera.videoverification.persistence.repository; 

import com.netcetera.videoverification.persistence.model.User; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 

@Repository 
public interface UserRepository extends CrudRepository<User,Long> { 
} 

这是服务:

package com.netcetera.videoverification.service; 

import com.netcetera.videoverification.persistence.model.User; 
import com.netcetera.videoverification.persistence.repository.UserRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.SimpleGrantedAuthority; 
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.stereotype.Service; 

import java.util.Collection; 
import java.util.HashSet; 

@Service 
public class UserService { 

    @Autowired 
    private UserRepository userRepository; 

    public boolean create(String username, String email, String password) { 
     String passwordHash = new BCryptPasswordEncoder().encode(password); 

     Collection<GrantedAuthority> authorities = new HashSet<>(); 
     authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); 
     User user = new User(username, passwordHash, authorities, email, "First", "Last"); 

     this.userRepository.save(user); 

     return true; 
    } 
} 

数据库条目的屏幕截图:

package com.netcetera.videoverification.persistence.model; 

import lombok.Getter; 
import lombok.Setter; 
import org.springframework.security.core.GrantedAuthority; 

import javax.persistence.*; 
import java.util.Collection; 

@Entity 
@Table(name = "user") 
@Setter 
@Getter 
public class User extends org.springframework.security.core.userdetails.User { 

    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private Long id; 

    private String email; 

    private String firstName; 

    private String lastName; 

    public User(String username, String password, Collection<? extends GrantedAuthority> authorities) { 
     super(username, password, authorities); 
    } 

    public User(String username, String password, Collection<? extends GrantedAuthority> authorities, String email, 
       String firstName, String lastName) { 
     super(username, password, authorities); 
     this.email = email; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
} 

存储库中的代码 DB entries screenshot

回答

1

发生这种情况是因为hibernate没有看到继承字段,因为超类没有标记为@MappedSuperclass注释。

你可以尝试从字段属性切换休眠接入方式,但它不会在所有的工作,要么因为密码字段中org.springframework.security.core.userdetails.Userprivate,没有setter和其他领域是private final,这使得冬眠不能以任何方式对其进行更新。

我可以建议,而不是延长org.springframework.security.core.userdetails.User自己创建usernamepasswordroles字段,然后只实现UserDetails接口,如果你需要通过一个实例这个类的其他地方(其中春季安全UserDetails对象预期)。