Подтвердить что ты не робот

Spring Солярий безопасности

Я пытаюсь добавить соль при добавлении нового пользователя /pwd, но docs, похоже, не хватает, как это сделать.

Вот базовый пример:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="md5">
            <salt-source user-property="username"/>
        </password-encoder>
    </authentication-provider>
</authentication-manager>

В качестве примера вы можете увидеть, что не используется ни пользовательский пароль, ни собственный пользовательский пароль.

Итак, как я могу подключить Salt при добавлении нового пользователя /pwd? Я бы предположил, что это будет что-то вроде:

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

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

Какую-нибудь подсказку, как сделать эту работу?

4b9b3361

Ответ 1

При добавлении пользователя вы не используете autowire 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;
}

Кроме того, autowire 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;
}