我有一个Spring应用程序,因为我希望它工作,但我遇到了一个我不明白的行为,即 为了使我的应用程序具有spring security,我必须使用我的hibenrate User类扩展我的UserRepositoryUserDetails类并实现UserDetails。如上所述一切正常,但我注意到UserDetails接口有一个名为“String getPassword();”的方法。在我的UserRepositoryUserDetails类中没有实现,但应用程序仍在工作。然后我实现了这个方法,并注意到我必须调用explicetelly超类getPassword才能使该构造变得笨拙。基本User类也有一个方法getPassword()以及“getUsername()”但我不理解的是为什么我需要告诉getPassword()使用来自超级类的方法,即“用户” “而且我不需要在getUsername()下调用super关键字;
@Override
public String getUsername() {
return getUserName();
}
@Override
public String getPassword() {
return super.getPassword();
}
这是有问题的课程。
import java.util.Collection;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.syncServer.Model.acount.Users;
final class UserRepositoryUserDetails extends Users implements UserDetails{
private static final long serialVersionUID = 4032653746283400246L;
public UserRepositoryUserDetails (Users user) {
super(user);
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return AuthorityUtils.createAuthorityList("ROLE_USER");
}
@Override
public String getUsername() {
return getUserName();
}
@Override
public String getPassword() {
return super.getPassword();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return getEnabled();
}
}
和第二类
@Repository
@Entity
@Table(name = "USERS")
public class Users {
@Id
@Type(type = "uuid-binary")
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2", parameters = { @Parameter(name = "uuid_gen_strategy_class", value = "org.hibernate.id.uuid.CustomVersionOneStrategy") })
@Column(name = "USER_ID")
private UUID userId;
@Column(unique = true)
@DuplicateUser
private String userName;
@UserPassword
private String password;
@UserPassword
private String PasswordHashVersion;
@NotNull
private Boolean enabled;
@NotNull
private String salt;
private String description;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "USER_ID")
@ElementCollection(fetch = FetchType.LAZY)
public Collection<Role> roles;
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "USER_ID")
@ElementCollection(fetch = FetchType.LAZY)
public Collection<Quota> quota;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "USER_ID")
@ElementCollection(fetch = FetchType.LAZY)
public Collection<UserAttribute> userAttribute;
public Users() {
}
public Users(Users user) {
this.setUserId(user.userId);
this.setUserName(user.userName);
this.setPassword(user.password);
this.setSalt(user.salt);
this.setEnabled(user.enabled);
this.setDescription(user.description);
}
public Users(@DuplicateUser @Name String userName,
@UserPassword String password, Boolean enabled, String description) {
this.userName = userName;
this.password = password;
this.salt = BCrypt.gensalt();
this.enabled = enabled;
this.description = description;
}
public Users(@DuplicateUser @Name String userName,
@UserPassword String password, String description, Role role,
Quota quota) {
this.userName = userName;
this.password = password;
this.roles.add(role);
this.quota.add(quota);
this.description = description;
}
public UUID getUserId() {
return userId;
}
public void setUserId(UUID userId) {
this.userId = userId;
}
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 getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public Collection<Role> getRoles() {
return roles;
}
public void setRoles(Collection<Role> roles) {
this.roles = roles;
}
public Collection<Quota> getQuota() {
return quota;
}
public void setQuota(Collection<Quota> quota) {
this.quota = quota;
}
public Collection<UserAttribute> getUserAttribute() {
return userAttribute;
}
public void setUserAttribute(Collection<UserAttribute> userAttribute) {
this.userAttribute = userAttribute;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
增加1:
我完全删除了@Override getPassword方法并启动了debuggin并将断点放在getUserName()下。抽象类AbstractAuthenticationToken具有名为getName的方法,该方法通过代理(UserDetails)从我的基本hibernate实体类调用getUserName,因此调用getUsername。另一个奇怪的事情是我的UserRepositoryUserDetails类实现了UserDetails,现在我没有getPassword()的任何实现,但是eclipse可以找到它。我迷路了:(,在我的java课程中,我了解到如果一个类实现接口,它必须实现所有的接口方法签名吗?