ini 文件当中配置散列
相关配置内容如下所示:
[main]
# 定义凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
# 散列算法
credentialsMatcher.hashAlgorithmName=md5
# 散列次数
credentialsMatcher.hashIterations=3
# 指定realm
myRealm=top.it6666.realm.MyRealm
# 配置散列
myRealm.credentialsMatcher=$credentialsMatcher
# 配置自定义散列
securityManager.realms=$myRealm
要保证存储在数据库中的密码是经过散列之后的,不然认证器进行认证的时候是通过你定义的规则去进行认证的,而你数据库存储的不一致会导致不成功,假如你设置认证的相关信息为盐为 BNTang
而数据库中已经存储的密码是通过 JonathanTang
盐值进行加密存储的,你登录的时候认证器去验证的时候就会导致双方不一致,所以数据库中存储的信息需要和你认证器设置的规则加密之后的信息一致才行。
首先我们自己使用 MD5 规则加密一串密文出来。
public void encryption() {
SimpleHash simpleHash = new SimpleHash("md5", "1234", "it6666", 3);
System.out.println(simpleHash);
}
80abd6b3faad22acb16bc1a11da51b2e
然后更改我们自定义的 Realm,更改之后的内容如下所示:
/**
* @author BNTang
*/
public class MyRealm extends AuthorizingRealm {
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取用户名
String username = (String) token.getPrincipal();
// 假如以下定义的用户名和密码是从数据库中查询出来的,实际中需要注入Dao去数据库中进行查询然后进行验证查询出来的信息是否合法
String myName = "BNTang";
String password = "80abd6b3faad22acb16bc1a11da51b2e";
// 如果输入的名称不和数据库查询出来的一致
if (!myName.equals(username)) {
return null;
}
// 如果等于,交给认证器去认证即可我们就无须关心了
return new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes("it6666"), this.getName());
}
}
测试方式,如下图所示: