记spring+shiro+redis 认证 授权缓存的探索

自定义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发送授权请求,获取安全密钥等信息。

至此这个问题得到解决。

发布了59 篇原创文章 · 获赞 11 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhangjianming2018/article/details/86606692