春季安全盐

时间:2011-11-09 15:47:14

标签: security spring salt

我在添加新用户/密码时尝试添加盐,但文档似乎缺少如何执行此操作。

这是一个基本的例子:

<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时如何连接Salt?我认为这将是:

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

但是,由于我使用的是默认的salt / password编码器,而且我没有自定义的salt bean,因此autowire会失败。

任何线索如何使这项工作?

1 个答案:

答案 0 :(得分:34)

添加用户时,您不会自动加载SaltSourceSaltSource是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;
}