Shiro 身份验证底层实现
依然靠数据库完成账号验证
Shiro处理密码验证
Shiro正常调用流程
Controller 页面请求和页面跳转,Subject.login(token)来调用Shiro验证
AuthorizingRealm的doGetAuthenticationInfo方法,来处理验证信息
在doGetAuthenticationInfo方法中,获取HttpSession,用于存储相关信息(比如用户的真名),之后在controller获取这个Session
private Session getSession(){
try{
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession(false);
if (session == null){
session = subject.getSession();
}
if (session != null){
return session;
}
}catch (InvalidSessionException e){
e.printStackTrace();
}
return null;
}
Shiro主过滤器 从上至下
/** = user 与 token.setRememberMe(true);
当着两条配合使用时,将会实现单点登录,并且关闭浏览器,下次依然可以访问资源。因为setRememberMe(true)会在浏览器生成一个cookie名rememberMe,它是用户名序列后,Base64后的加密字符串,记住登录状态
/敏感界面 = authc 配置在 /** = user 前
当退出浏览器时,敏感界面需要再次做验证。比如支付界面
UsernamePasswordToken.getPassword() 获得是char数组,而不是String
原因:打开源码,shiro对没有逻辑意义的密码,有一个clear()方法来清除密码。但是String是一个final对象,是没有clear()方法的,即时是空的密码,也会在内存中被记录保留。因此shiro会将用户输入的密码转为char数组。因此shiro推荐做一次MD5加密,来二次比对数据库中被MD5加密的密码
MD5加密流程
- 数据库放入MD5加密后的密文密码,记录盐值
- 前台输入明文密码,被token记录
- Token进入方法doGetAuthenticationInfo,在new SimpleAuthenticationInfo 中完成配置文件中凭证规则的加密
- 匹配new SimpleAuthenticationInfo 方法中user.getPassword()获得数据库的加密密码
Shiro 退出登录
不需要编写controller层代码,只需要编写前台的跳转界面地址,对应shiro配置文件的
/URL = logout 即可,退出登录的操作交于shrio来处理
进入授权doGetAuthorizationInfo方法一共有三种情况:
1、subject.hasRole(“admin”) 或 subject.isPermitted(“admin”):自己去调用这个是否有什么角色或者是否有什么权限的时候;
2、@RequiresRoles("admin") :在方法上加注解的时候;
3、[@shiro.hasPermission name = "admin"][/@shiro.hasPermission]:在页面上加shiro标签的时候,即进这个页面的时候扫描到有这个标签的时候
被URL拦截后,除去JSESSIONID
需求版本shiro-spring-1.4.0.jar
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 去除JSESSIONID -->
<property name="sessionIdUrlRewritingEnabled" value="false"></property>
</bean>
来源:https://blog.csdn.net/careyliang/article/details/98745883