Spring security 自定义用户详细信息@Id 问题

Posted

技术标签:

【中文标题】Spring security 自定义用户详细信息@Id 问题【英文标题】:Spring security custom user details @Id issue 【发布时间】:2021-09-09 12:29:21 【问题描述】:

我目前正在开发一个具有 Spring Security 的 Spring Boot API 来注册和登录。

@Entity
public class Users

    @Id
    @Column(name = "userid", unique = true, nullable = false)
    public String userid;


    @Email
    @Column(unique = true, nullable = false)
    public String username;

    @JsonProperty(access = JsonProperty.Access.READ_WRITE)
    private String password;

    @Column(columnDefinition = "boolean default true")
    public boolean enabled;

道类

@EnableTransactionManagement
public interface UserDao extends JpaRepository<Users, String> 
    public Users findDistinctByUsername(String username);

控制器

Users user = userdao.findDistinctByUsername(username);

当我使用用户名作为@Id 时它工作正常,但如果我使用用户名作为@Id,我会收到错误

错误: org.springframework.orm.jpa.JpaSystemException:通过反射持久属性 [com.example.demo.Model.Users#username] 访问字段 [public java.lang.String com.example.demo.Model.Users.username] 时出错: T1EzQkExUU41Tg;嵌套异常是 org.hibernate.property.access.spi.PropertyAccessException: Error access field [public java.lang.String com.example.demo.Model.Users.username] 通过反射持久属性 [com.example.demo.Model .Users#username] : T1EzQkExUU41Tg",

T1EzQkExUU41Tg: 用户 ID

【问题讨论】:

数据库中用户id的数据类型是什么 用户 ID:Varchar 【参考方案1】:

当您在 String 上使用 @id 时,您必须指定生成类型,否则它将默认从数据库自动递增为 int。这就是你出错的原因。

@id
private int id;

您必须为字符串属性定义自己的自定义生成器。

@Id
@GeneratedValue(//add the generation type here)
private Long id;

【讨论】:

我在服务级别手动生成Id,这就是为什么我没有使用@GeneratedValue

以上是关于Spring security 自定义用户详细信息@Id 问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Oauth2:主体对象未返回扩展的用户详细信息

如何在 Spring Security Bean 中模拟自定义 UserService 详细信息以进行单元测试?

Spring Security教程:自定义表结构

Spring-Security oauth2 创建自定义 oauth_client_details 表

Spring Security 预认证账户锁定检查

Spring Security教程:自定义数据库查询