Весенняя Соль Безопасности - PullRequest
23 голосов
/ 09 ноября 2011

Я пытаюсь добавить соль при добавлении нового пользователя / 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?Я бы предположил, что это будет что-то вроде:

@Autowired SaltSource saltSource;
protected void foo(final CustomUser user) {
    final PasswordEncoder encoder = new Md5PasswordEncoder();
    user.setPassword(encoder.encodePassword(user.getPassword(), saltSource));
}

Однако, поскольку я использую кодировщики соли / пароля по умолчанию и у меня нет настраиваемого солевого компонента, автоматическая передача не удалась бы.

Любая подсказка, как заставить это работать?

1 Ответ

34 голосов
/ 09 ноября 2011

Вы не можете автоматически подключить 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 не будет работать, пока не будет определен как внутренний компонент. Вы можете определить ReflectionSaltSource как bean-компонент верхнего уровня и передать его идентификатор 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;
} 
...