Java Spring security UserDetails interace getPassword

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类中没有得到完善,但应用程序仍在工作。然后我实现了这个方

我有一个Spring应用程序,我希望它能正常工作,但我遇到了一个我不理解的行为,即。 为了使我的应用程序具有spring安全性,我必须用hibenrate用户类扩展UserRepositoryUserDetails类并实现UserDetails。如前所述,所有这些都可以很好地工作,但我注意到UserDetails接口有一个名为“String getPassword();”的方法,该方法在我的UserRepositoryUserDetails类中没有得到完善,但应用程序仍在工作。然后我实现了这个方法,并注意到我必须调用explicetelly这个超级类getPassword,以使这个构造能够工作。基本用户类也有一个方法getPassword()和“getUsername()”,但我不明白的是,为什么我需要在getPassword()中告诉用户如何使用超级类中的方法,即“User”,我不需要调用getUsername()下的super关键字

以下是有问题的课程

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然后我在作者姓名中看到了你的名字:)。我添加了我的发现,请参见我的问题的添加1
getUsername
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;
    }

}