新しいユーザー/ pwdを追加するときにソルトを追加しようとしていますが、ドキュメントにこれを行う方法がないようです。
基本的な例は次のとおりです。
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="md5">
<salt-source user-property="username"/>
</password-encoder>
</authentication-provider>
</authentication-manager>
この例から、カスタムソルトもカスタムパスワードエンコーダも使用されていないことがわかります。
では、新しいユーザー/ pwdを追加するときに、Saltをどのように接続しますか?私はそれが次のようなものになると思います:
@Autowired SaltSource saltSource;
protected void foo(final CustomUser user) {
final PasswordEncoder encoder = new Md5PasswordEncoder();
user.setPassword(encoder.encodePassword(user.getPassword(), saltSource));
}
ただし、デフォルトのソルト/パスワードエンコーダーを使用していて、カスタムソルトBeanがないため、自動配線が失敗します。
これを機能させる方法の手がかりはありますか?
ユーザーを追加するときに、SaltSource
を自動配線しません。 SaltSource
は、Springがパスワードチェックのみのソルトのソースを提供するために使用する抽象化です。
適切にエンコードされたパスワードハッシュを作成するにはソルト自体をPasswordEncoder
に渡すだけです。username
ではなくSaltSource
プロパティの値です。
private PasswordEncoder encoder = new Md5PasswordEncoder();
public User createUser(String username, String plainTextPassword) {
User u = new User();
u.setUsername(username);
u.setPassword(encoder.encodePassword(plainTextPassword, username));
getEntityManager().persist(u); // optional
return u;
}
さらに、SaltSource
の自動配線は、内部Beanとして定義されるまで機能しません。 ReflectionSaltSource
をトップレベルのBeanとして定義し、そのIDをpassword-encoder
に渡すことができます。
<bean id="saltSource"
class="org.springframework.security.authentication.dao.ReflectionSaltSource"
p:userPropertyToUse="username" />
<bean id="passwordEncoder"
class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />
<bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"
p:passwordEncoder-ref="passwordEncoder"
p:saltSource-ref="saltSource"
p:userDetailsService-ref="userDetailsService" />
<authentication-manager>
<authentication-provider ref="daoAuthenticationProvider" />
</authentication-manager>
その後:
@Autowired private PasswordEncoder passwordEncoder;
@Autowired private SaltSource saltSource;
public CustomUserDetails createUser(String username, String plainTextPassword) {
CustomUserDetails u = new CustomUserDetails();
u.setUsername(username);
u.setPassword(passwordEncoder.encodePassword(
plainTextPassword, saltSource.getSalt(u)));
getEntityNamager().persist(u); // optional
return u;
}