1,在身份认证过程往往会涉及加密,如果不加密那么数据信息不安全。Shiro内容实现了比较多的散列算法。如MD5、SHA等/而且提供了加盐功能。比如”123456”的md5码为: e10adc3949ba59abbe56e057f20f883e,这个MD5码很多网站可以找到相应的原密码。但是如果MD5+姓名,那么找到原密码的难道会增加。
2,在自定义Realm中使用散列
/**
* 自定义realm
* @author reyco
*/
public class UserRealm extends AuthorizingRealm{
@Override
public String getName() {
return "UserRrealm";
}
/**
* 完成身份认证(从数据库取数据),并且返回认证信息
* 如果身份认证失败返回null
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取用户输入的用户名
String username = (String)token.getPrincipal();
System.out.println("username111111="+username);
//获取密码
//按照固定规则加密码结果,此密码要在数据库存储,原始密码是123456,盐是salt 2次散列
String password = "de43312a6c66a5dc70fd1aa160f2abec";//假如从数据库中获取密码为123456
String salt="reyco";
//返回认证信息
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(username,password,ByteSource.Util.bytes(salt),this.getName());
return simpleAuthenticationInfo;
}
/**
* 授权的信息
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection token) {
return null;
}
}
shiro.ini 配置
[main]
## realm配置
#定义凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#散列算法
credentialsMatcher.hashAlgorithmName=md5
#散列次数
credentialsMatcher.hashIterations=2
userRealm=com.shiro.reyco.core.realm.UserRealm
userRealm.credentialsMatcher=$credentialsMatcher
securityManager.realm=$userRealm
测试:
public class Test {
public static void main(String[] args) {
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("reyco", "123456");
try {
subject.login(token);
if (subject.isAuthenticated())
System.out.println("用户登录成功");
} catch (UnknownAccountException e) {
e.printStackTrace();
System.out.println("用户或密码错误");
}catch (IncorrectCredentialsException e) {
e.printStackTrace();
System.out.println("用户或密码错误");
}
}
}