【发布时间】:2021-03-25 23:30:53
【问题描述】:
我正在开发一个 Spring 安全项目。我尝试扩展 security.core.userdetails.User 类以在注册用户时添加更多详细信息。
用户扩展类
public class UserDetails extends User {
private int id;
private String Country;
public UserDetails(String username, String password, Collection<? extends GrantedAuthority> authorities, int id,
String country) {
super(username, password, authorities);
this.id = id;
Country = country;
}
public UserDetails(String username, String password, boolean enabled, boolean accountNonExpired,
boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities,
int id, String country) {
super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
this.id = id;
Country = country;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountry() {
return Country;
}
public void setCountry(String country) {
Country = country;
}
我还在实体类(模型类)中添加了 ID 和国家/地区。
但是当我尝试注册用户时。 它给出一个错误。org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [插入用户(用户名,密码,启用)值(?,?,?)];字段“id”没有默认值;嵌套异常是 java.sql.SQLException: Field 'id' doesn't have a default value
(id和国家的值是硬编码的)
控制器类
try {
List<GrantedAuthority> authority = new ArrayList<>();
authority.add(new SimpleGrantedAuthority(form.getRole()));
String encodedPassword = passwordEncoder.encode(form.getPassword());
UserDetails details = new UserDetails(form.getUsername(), encodedPassword, authority, 10 ,"India");
System.out.println(details.getId()+" "+details.getCountry() +" "+details.getUsername());
System.out.println(details);
detailsManager.createUser(details);
}
输出
10 印度 alpha@gmail.com
com.example.demo.model.UserDetails [Username=alpha@gmail.com, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN]]
我不知道它为什么调用父类构造函数。
【问题讨论】:
-
可以添加用户类定义吗?
-
用户是spring security用户类(org.springframework.security.core.userdetails.User)
标签: spring spring-boot spring-security spring-data-jpa