gpt4 book ai didi

security - Spring 安全盐

转载 作者:IT老高 更新时间:2023-10-28 13:48:05 26 4
gpt4 key购买 nike

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

这是一个基本的例子:

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

您可以通过示例看到没有使用自定义盐或自定义密码编码器。

那么,在添加新用户/密码时,我将如何连接 Salt?我认为它会是这样的:

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

但是,由于我使用的是默认盐/密码编码器,并且我没有自定义盐 bean,因此 Autowiring 会失败。

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

最佳答案

添加用户时,您不会 Autowiring SaltSourceSaltSource 是 Spring 用来为 密码检查 提供 salt 来源的抽象。

创建正确编码的密码散列 您只需将盐本身传递给 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 的 Autowiring 在它被定义为内部 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;
}

关于security - Spring 安全盐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8067564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com