web-dev-qa-db-ja.com

春のセキュリティソルト

新しいユーザー/ 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がないため、自動配線が失敗します。

これを機能させる方法の手がかりはありますか?

23
user973479

ユーザーを追加するときに、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;
} 
34
Roadrunner