Java Spring security UserDetails interace getPassword
我有一个Spring应用程序,我希望它能正常工作,但我遇到了一个我不理解的行为,即。 为了使我的应用程序具有spring安全性,我必须用hibenrate用户类扩展UserRepositoryUserDetails类并实现UserDetails。如前所述,所有这些都可以很好地工作,但我注意到UserDetails接口有一个名为“String getPassword();”的方法,该方法在我的UserRepositoryUserDetails类中没有得到完善,但应用程序仍在工作。然后我实现了这个方法,并注意到我必须调用explicetelly这个超级类getPassword,以使这个构造能够工作。基本用户类也有一个方法getPassword()和“getUsername()”,但我不明白的是,为什么我需要在getPassword()中告诉用户如何使用超级类中的方法,即“User”,我不需要调用getUsername()下的super关键字 以下是有问题的课程Java Spring security UserDetails interace getPassword,java,spring-mvc,spring-security,Java,Spring Mvc,Spring Security,我有一个Spring应用程序,我希望它能正常工作,但我遇到了一个我不理解的行为,即。 为了使我的应用程序具有spring安全性,我必须用hibenrate用户类扩展UserRepositoryUserDetails类并实现UserDetails。如前所述,所有这些都可以很好地工作,但我注意到UserDetails接口有一个名为“String getPassword();”的方法,该方法在我的UserRepositoryUserDetails类中没有得到完善,但应用程序仍在工作。然后我实现了这个方
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();
}
}
import java.util.Collection;
导入org.springframework.security.core.GrantedAuthority;
导入org.springframework.security.core.authority.AuthorityUtils;
导入org.springframework.security.core.userdetails.userdetails;
导入org.syncServer.Model.acount.Users;
最终类UserRepositoryUserDetails扩展用户实现UserDetails{
私有静态最终长serialVersionUID=4032653746283400246L;
公共用户RepositoryUserDetails(用户){
超级用户;
}
@凌驾
public collection调用getUsername
似乎根本不太可能,因为它不会返回。我将调试您的身份验证代码,并查看更详细的情况。如果您使用的是自定义AuthenticationProvider
,它可能永远不会被调用。我按照您的建议开始调试,并遇到了AbstractAuthenticationToken然后我在作者姓名中看到了你的名字:)。我添加了我的发现,请参见我的问题的添加1getUsername
和getUsername
是不同的方法。注意这个情况。好吧,所以我在整个项目中将getUsername改为getUsename,然后我发现我也需要在getUsername中使用关键字super,t我对此的解释是,当我使用“@Override public String getUsername”时,它正在调用接口“UserDetails”定义的对象,但是因为UserRepositoryUserDetails正在扩展Users”,所以“getUsername”和“get”getUsername之间没有歧义可以从父类调用正确的方法。我需要澄清的最后一件事是,当UserRepositoryUserDetails没有实现接口“UserDetails”所暗示的getPassword()方法时,为什么eclipse对该构造没有问题。
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;
}
}