我正在使用Spring Roo框架,它使用Spring Security作为安全框架。我按照以下方式配置它:
<authentication-manager alias="authenticationManager">
<!-- SHA-256 values can be produced using 'echo -n your_desired_password | sha256sum' (using normal *nix environments) -->
<authentication-provider>
<password-encoder hash="sha-256">
<!-- <salt-source user-property="login"/> -->
</password-encoder>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="
SELECT login, password, enabled
FROM user WHERE login = ?"
authorities-by-username-query="
SELECT u.login, r.authority
FROM user u, rol r,
usuer_role ur
WHERE u.login = ur.usuarer
AND r.roleId = ur.role
AND u.login = ?"
/>
<user-service>
<user name="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918" authorities="ROLE_ADMIN" />
<user name="user" password="04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
为了使密码匹配,我编辑了UserController
create
方法,因此使用SHA-256哈希存储密码,与applicationContext-security.xml
中配置的密码相同安全配置文件。
我就是这样做的:
public String create(@Valid User user, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) throws NoSuchAlgorithmException, UnsupportedEncodingException {
if (bindingResult.hasErrors()) {
populateEditForm(uiModel, usuario);
return "security/users/create";
}
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(user.getPassword().getBytes("UTF-8"));
byte[] digest = md.digest();
usuario.setPassword( new String(digest, "UTF-8"));
uiModel.asMap().clear();
user.persist();
return "redirect:/security/users/" + encodeUrlPathSegment(usuario.getId().toString(), httpServletRequest);
}
我尝试将密码设置为admin
,这与默认用户提供的密码相同:admin,密码:admin配置文件,以检查我的create
方法生成的密码是否匹配
但是,配置文件中的散列密码为8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
,但是当我通过控制台或mysql
检查ivAMgsKo*H
数据库时,存储在数据库中的密码是一组奇怪的字符。显示在页面中。
有任何帮助吗?
答案 0 :(得分:4)
最后我提出了这个解决方案,感谢@Oleg Estekhin评论:
public String sha256(String original) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(original.getBytes());
byte[] digest = md.digest();
return new String(Hex.encodeHexString(digest));
}
答案 1 :(得分:-1)
但是,配置文件中的哈希密码是 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918但是存储在&gt;中的那个。当我通过控制台或检查我的mysql数据库时,数据库是一组奇怪的字符 ivAMgsKo * H显示在页面中。
8c6976e5b541041...
看起来像Base64编码数据。
虽然
ivAMgsKo*H
和你的代码
new String(digest, "UTF-8")
告诉我,您的摘要未编码,但存储为UTF-8字符串。
哈希值可以包含不可打印的字节值,因此通常对值进行编码。例如使用Base64。