2012-09-03 260 views
2

我希望能夠稍微改變彈簧安全性,以便通過Principal對象訪問名稱,電子郵件。彈簧安全定製

此外,要登錄我想用戶的電子郵件,而不是用戶名。

我該從哪裏開始,或者這已經是可能的了?

回答

1

根本不可能。儘管你需要提供你自己的UserDetails實現。它並不是非常困難。 This article顯示了一種可行的方法。以下是我最近使用的一些代碼:

我開始提供自己的UserDetails impelementation,以適合我的目的。實際上,我在Staff類中擁有所有額外的細節,並且只需從MyUser到Staff的「多對一」參考。不過,我簡化了這個答案,並且直接在MyUser類中包含了fullName和email屬性。

public class MyUser implements UserDetails { 

    @NotNull 
    @Size(min = 3, max = 50) 
    private String username; 

    @NotNull 
    @Size(min = 3, max = 256) 
    private String password; 

    private Boolean enabled; 

    private Boolean accountNonLocked; 

    private Boolean accountNonExpired; 

    private Boolean credentialsNonExpired; 

    private String email; 

    private String fullName; 

    private GrantedAuthority authorities; 


    @Override  
    public Collection<GrantedAuthority> getAuthorities() { 
    return authorities; 
    } 

    @Override 
    public String toString() { 
    return username; 
    } 

    @Override 
public boolean isAccountNonExpired() { 
     return this.accountNonExpired; 
    } 

    @Override 
public boolean isCredentialsNonExpired() { 
     return this.credentialsNonExpired; 
    } 

    @Override 
public boolean isAccountNonLocked() { 
     return this.accountNonLocked; 
    } 

    @Override 
public boolean isEnabled() { 
     return this.enabled; 
    } 

    public String getEmail(){ 
     return email; 
    } 

    public String getFullName(){ 
     return fullName; 
    } 
} 

然後我提供了我自己的User Details Service實現,因爲我使用Hibernate將所有內容保存在數據庫中。您可能需要不同的實現:

public class MyUserDetailsService implements UserDetailsService { 

    @Override 
    public UserDetails loadUserByUsername(String username) 
     throws UsernameNotFoundException, DataAccessException { 
     UserDetails userDetails = null; 

    TypedQuery<MyUser> q = MyUser 
      .findMyUsersByUsernameEquals(username); 
    userDetails = q.getSingleResult(); 
    if (userDetails == null) 
     throw new UsernameNotFoundException("user not found"); 
    return userDetails; 
    } 

} 

然後在我加入這個ApplicationContext的-security.xml文件:

<!-- Add a custom UserDetailsService --> 
<beans:bean id="udservice" class="my.package.name.security.MyUserDetailsService"></beans:bean> 

這:

<!-- Configure Authentication mechanism --> 
<authentication-manager alias="authenticationManager">  
    <authentication-provider user-service-ref="udservice"> 
     <password-encoder hash="sha-256" />  
    </authentication-provider> 
</authentication-manager> 

現在,當你訪問用戶即登錄您獲得您的類的實例並訪問其所有屬性。