笔记
Shiro登陆认证流程
1.通过SeucrityUtils获取当前用户(Subject),调用SecurityUtils.getSubject()方法
2.判断用户是否登陆currentUser.isAuthenticated()
3.如果用户没有登陆,获取登录页面传过来的值(SpringMVC@Handler)
4.创建令牌UsernamePasswordToken token = new UsernamePasswordToken(#userName, #password)
5.通过Realm(继承org.apache.shiro.realm.AuthenticatingRealm)与数据库中的用户密码比对
密码的比对:通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!
密码加密
# 如何把一个字符串加密为 MD5?
替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可.
# 使用 MD5 盐值加密:
如何做到:
1). 在 doGetAuthenticationInfo 方法返回值创建 SimpleAuthenticationInfo 对象的时候, 需要使用
SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 构造器
2). 使用 ByteSource.Util.bytes() 来计算盐值.
3). 盐值需要唯一: 一般使用随机字符串或 user id
4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 来计算盐值加密后的密码的值.
#如何授权
1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法
2. AuthorizingRealm 类继承自 AuthenticatingRealm, 但没有实现 AuthenticatingRealm 中的
doGetAuthenticationInfo, 所以认证和授权只需要继承 AuthorizingRealm 就可以了. 同时实现他的两个抽象方法.
总结:1.Shiro加密原先实现方法都是写加密工具类,可以通过配置MD5盐值加密,这样加密都不用自己实现,当然你向数据库中存数据时当然要手写加密算法,一会把之前做多Realm测试的加密算法贴出来
2.URL权限资源可以放到配置文件或数据库中,这些就降低了Spring配置文件的压力,一堆堆的URL配置很占空间.
3.授权时要注意在配置MD5盐值加密时注意接口
4.我在学习时候已经把上面的笔记写在配置文件中了
public static void main(String[] args) {
String algorithmName="MD5" ;
Object source="admin1234" ;
String salt="admin";
int hashIterations=1024 ;
Object result= new SimpleHash(algorithmName, source, salt, hashIterations) ;
System.out.println(result); //02bad5ac06ea6ce0be3a24fd39781d11
}