使用shiro的MD5Hash对密码进行加盐加密及验证
步骤1、在添加用户的时候,将密码加密之后再保存
这里是使用的shiro框架中自带的MD5hash加密算法
//保存用户
@Override
public void saveUser(User user) {
String uuid= UUID.randomUUID().toString();
user.setUserId(uuid);
//将用户的密码进行加盐加密
if (user.getPassword() != null) {
//参1 需要加密的密码 参2 增加密码复杂度的字符串
user.setPassword(new Md5Hash(user.getPassword(), user.getEmail()).toString());
}
iUserDao.save(user);
}
步骤2、登录时,验证密码使用,先对密码明文进行加密,再判断加密后的密文是否相等
1)、先编写一个自己的凭证匹配器,将这个匹配器注入到realm中,在登录验证密码时,就会去到这个凭证匹配器中验证密码
自定义凭证匹配器需要继承指定的父类
public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {
private static final Logger l = LoggerFactory.getLogger(CustomCredentialsMatcher.class);
//加盐加密
@Override
public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
//获取用户名和密码 (明文)
UsernamePasswordToken t = (UsernamePasswordToken) token;
String email = t.getUsername();
// 密码在token中是char[] 类型,需要转换成字符串
String password = new String(t.getPassword());
//加密
Md5Hash md5Hash = new Md5Hash(password,email); //参1 需要加密的密码, 参2 加盐的参数
l.info("CustomCredentialsMatcher md5Hash " + md5Hash.toString());
//取数据库的密码进行比较
String pwd = (String) info.getCredentials();
if (pwd.equals(md5Hash.toString())) {
return true;
} else {
return false;
}
}
}
2)、applicationContex-shiro.xml配置文件中,需要配置自定义的凭证匹配器,并将凭证匹配器注入到realm中
<!--定义自己的凭证匹配器-->
<bean id="customCredentialsMatcher" class="com.wzx.web.utils.CustomCredentialsMatcher"/>
<!--配置realm-->
<bean id="realm" class="com.wzx.web.shiro.AuthRealm">
<property name="credentialsMatcher" ref="customCredentialsMatcher"/>
</bean>