自定义realm 实现了 账号认证 和 资源授权以及角色授权的处理,但是频繁的查询必然影响了性能,因此配置了redis 存储授权信息和认真信息
<bean id="myShiroRealm" class="com.jufengad.insurance.web.shiro.InsuranceShiroRealm">
<property name="cacheManager" ref="shiroSpringCacheManager"/>
<property name="credentialsMatcher" ref="credentialsMatcher"/>
<property name="cachingEnabled" value="true"/>
<!-- 打开授权缓存 -->
<property name="authorizationCachingEnabled" value="true"/>
<!-- 缓存AuthorizationInfo信息的缓存名称, 但配置的缓存名称并没有效果。。待研究 -->
<property name="authorizationCacheName" value="authorizationCache"/>
<!-- 打开身份认证缓存 ,打开后不能多点登陆。。待研究-->
<property name="authenticationCachingEnabled" value="true"/>
<!-- 缓存AuthenticationInfo信息的缓存名称 -->
<property name="authenticationCacheName" value="authenticationCache"/>
</bean>
但是有两个问题
第一:配置了授权的缓存名称 ,但是缓存的key 并没有按照名称规则存储,如下
我们配置的认证缓存key,却是正常的,如下
第二,抛开第一个问题,先不处理,直接验证缓存的有效性,数据都已经存储在redis中,尽管key 跟我们的配置不一致,但认证缓存的配置 导致了一个更严重的问题:当账户第一次登陆后,如果不退出,那么就无法再次登陆(场景:例如更换浏览器)
继续更新
经过debug奋战,发现跳转并不是框架自身的问题,当同一个用户再次登陆的时候 认证信息确实从缓存里获取的,而且成功获取,说明认证缓存是正常的,那么跳转回登陆页面 自然是自己挖的坑。。。
因项目前后端分离的架构, 前端跟server通信 需提前获取 security key 来作为server端的认证, 第一次登陆前端系统 由于没有缓存 就调用了server端的授权API 获取数据(如 名称 密码 安全密钥等信息) 当前端认证通过后 将server 返回的信息 放入session中,每次跟server端通信都需要传送安全密钥 就是JWT的无状态协议原理。
那么问题来了,更换浏览器后 相同的账户登陆系统 并没有再次向server端进行授权请求,所以没有安全密钥,于是server端返回了错误响应 导致前端直接退出 又回到了登陆页面。
鉴于系统目前的架构,想要使用shiro的认证缓存,需在shiro认证通过后 再次向server发送授权请求,获取安全密钥等信息。
至此这个问题得到解决。