2

プリンシパルオブジェクトを介して名前、電子メールにアクセスできるように、春のセキュリティを少し変更できるようにしたいと思います。

また、ログインするには、ユーザー名ではなく電子メールを使用したいと考えています。

どこから始めればよいですか、またはこれはすでに可能ですか?

4

1 に答える 1

1

まったく不可能ではありません。ただし、UserDetails の独自の実装を提供する必要があります。それほど難しいことではありません。この記事では、それを実行するための 1 つの可能な方法を示します。以下は、最近使用したコードです。

まず、目的に合った独自の UserDetails 実装を提供することから始めました。私は実際にはすべての追加の詳細を Staff クラスに持っており、単に MyUser から Staff への多対 1 の参照を持っています。ただし、この回答では単純化して、fullName および email プロパティを MyUser クラスに直接含めました。

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;
    }
}

次に、Hibernate を使用してデータベース内のすべてを永続化するため、独自の User Details Service 実装を提供しました。別の実装が必要になる場合があります。

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>

ログインしているユーザーにアクセスすると、クラスのインスタンスが取得され、そのすべてのプロパティにアクセスできます。

于 2012-09-03T21:32:12.557 に答える