Spring安全性UserDetails interace getPassword

时间:2014-09-16 09:05:20

标签: java spring-mvc spring-security

我有一个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课程中,我了解到如果一个类实现接口,它必须实现所有的接口方法签名吗?

0 个答案:

没有答案