<s:authentication-provider user-service-ref="userDetailsService">
<!-- 可设置hash使用sha1或md5散列密码后再存入数据库 -->
<s:password-encoder hash="md5" >
<s:salt-source user-property="username"/>
</s:password-encoder>
</s:authentication-provider>
这里设置成username为salt,进行md5加密。
那么在用户注册的时候应该把密码进行加密。可以用Md5PasswordEncoder这个类,是springsecurity内置的一个类。
其中encodePassword()函数的第一个参数是密码,第二个参数是salt值。
那么encodePassword()函数是怎么样吧rawPass和salt值结合起来的呢?
找了一下源代码发现
在调用此函数时,也就是返回 rawPass{salt}。Md5PasswordEncoder是将strict参数设置为false。那么就不会检查salt值中是否含有 '{' 和 '}' 。我试了一下,如果salt中含有大括号的话,加密过后的密封是无法使用的。就是说用户虽然注册了,但是无法登陆。(这个可能和加密算法有关?)
版本:2.0.5
<!-- 可设置hash使用sha1或md5散列密码后再存入数据库 -->
<s:password-encoder hash="md5" >
<s:salt-source user-property="username"/>
</s:password-encoder>
</s:authentication-provider>
这里设置成username为salt,进行md5加密。
那么在用户注册的时候应该把密码进行加密。可以用Md5PasswordEncoder这个类,是springsecurity内置的一个类。
Md5PasswordEncoder md5 = new Md5PasswordEncoder();
System.out.println( md5.encodePassword("admin", "admin"));
其中encodePassword()函数的第一个参数是密码,第二个参数是salt值。
那么encodePassword()函数是怎么样吧rawPass和salt值结合起来的呢?
找了一下源代码发现
protected String mergePasswordAndSalt(String password, Object salt, boolean strict) {
if (password == null) {
password = "";
}
if (strict && (salt != null)) {
if ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1)) {
throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
}
}
if ((salt == null) || "".equals(salt)) {
return password;
} else {
return password + "{" + salt.toString() + "}";
}
}
在调用此函数时,也就是返回 rawPass{salt}。Md5PasswordEncoder是将strict参数设置为false。那么就不会检查salt值中是否含有 '{' 和 '}' 。我试了一下,如果salt中含有大括号的话,加密过后的密封是无法使用的。就是说用户虽然注册了,但是无法登陆。(这个可能和加密算法有关?)
版本:2.0.5