一,HashedCredentialsMatcher
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
//设置加密算法
matcher.setHashAlgorithmName("md5");
//设置加密次数
matcher.setHashIterations(1);
userRealm.setCredentialsMatcher(matcher);
此时,获取到的密码应该是经过加密的
传入的账号和密码,从后台获取到的应该是加密后的111,即:698d51a19d8a121ce581499d7b701668
UsernamePasswordToken token = new UsernamePasswordToken("lmc", "111");
加密
Md5Hash md5Hash = new Md5Hash("111");//698d51a19d8a121ce581499d7b701668
代码:
@Test
public void testAuthentication() {
UserRealm userRealm = new UserRealm();
//构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(userRealm);
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
//设置加密算法
matcher.setHashAlgorithmName("md5");
//设置加密次数
matcher.setHashIterations(1);
userRealm.setCredentialsMatcher(matcher);
//主体提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("lmc", "111");
//登录
subject.login(token);
System.out.println("isAuthenticated : " + subject.isAuthenticated());
//获取登录名
System.out.println(subject.getPrincipal());
}
二,加盐
第一步:对加密的字段进行加盐
new Md5Hash(password, "hh")//在加密的密码上加盐hh
第二步:在自定义realm中添加:
authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("hh"));
结果:
/**
* 认证
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//1.得到令牌
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//2.调用业务组件进行登录判断
User user = new User();
user.setUsername(token.getUsername());
// user.setPassword(new String(token.getPassword()));
System.out.println("lmc = " + token.getUsername() );
UserService userService = new UserService();
List<User> users = userService.find((String) authenticationToken.getPrincipal(), "111");
//3.判断用户是否为空,如果不为空代表登录成功
if (users != null) {
user = users.get(0);
/*
参数1:主角(用户对象)
参数2:密码
参数3:realm的类名
*/
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), "userRealm");
//加盐验证
authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("hh"));
return authenticationInfo;
}
return null;
}
本文详细介绍了使用Shiro框架进行用户身份认证的过程,包括如何设置HashedCredentialsMatcher进行密码加密,以及如何通过加盐增强安全性。通过具体代码示例,展示了如何在Shiro中配置MD5加密算法和迭代次数,以及如何在自定义Realm中实现加盐验证。
2984

被折叠的 条评论
为什么被折叠?



