【问题标题】:H2 not storing username, password and roleH2 不存储用户名、密码和角色
【发布时间】:2017-06-09 14:46:26
【问题描述】:

问题是 h2 只存储了我的类 User 的属性,但未能存储 Spring Security 的 User 类的属性用户名、密码和权限。

这是我的用户类:

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;
    }
}

存储库的代码:

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;
    }
}

数据库条目的屏幕截图: DB entries screenshot

【问题讨论】:

    标签: spring jpa spring-security h2


    【解决方案1】:

    这是因为 hibernate 没有看到继承的字段,因为超类没有用@MappedSuperclass 注释标记。

    您可以尝试将休眠访问模式从字段切换到属性,但这也不起作用,因为org.springframework.security.core.userdetails.User 中的密码字段是private,根本没有设置器,其他字段是private final,这使得休眠无法以任何方式更新它们。

    我可以建议不要扩展 org.springframework.security.core.userdetails.User,而是自己创建 usernamepasswordroles 字段,然后如果您需要在其他地方传递此类的实例(其中 spring需要安全 userdetails 对象)。

    【讨论】:

      猜你喜欢
      • 2022-12-19
      • 2013-12-27
      • 2011-10-08
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2019-09-02
      相关资源
      最近更新 更多