弹簧安全定制

时间:2012-09-03 21:24:22

标签: java spring spring-mvc spring-security

我希望能够稍微改变弹簧安全性,以便通过Principal对象访问名称,电子邮件。

同样要登录我想要用户使用电子邮件,而不是用户名。

我从哪里开始或者这已经可以了?

1 个答案:

答案 0 :(得分:1)

根本不可能。您需要提供自己的UserDetails实现。它根本不是很难。 This article显示了一种可行的方法。以下是我最近使用的一些代码:

我首先提供了适合我目的的自己的UserDetails实施例。我实际上在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>

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