2012-09-03 220 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> 

现在,当你访问用户即登录您获得您的类的实例并访问其所有属性。