プリンシパルオブジェクトを介して名前、電子メールにアクセスできるように、春のセキュリティを少し変更できるようにしたいと思います。
また、ログインするには、ユーザー名ではなく電子メールを使用したいと考えています。
どこから始めればよいですか、またはこれはすでに可能ですか?
プリンシパルオブジェクトを介して名前、電子メールにアクセスできるように、春のセキュリティを少し変更できるようにしたいと思います。
また、ログインするには、ユーザー名ではなく電子メールを使用したいと考えています。
どこから始めればよいですか、またはこれはすでに可能ですか?
まったく不可能ではありません。ただし、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>
ログインしているユーザーにアクセスすると、クラスのインスタンスが取得され、そのすべてのプロパティにアクセスできます。