标签:缓存 自定义 验证 调用 key apache org AuthenticationInfo shiro
这个问题也是折磨了我半天:// 注意本文中绿色字体和红色字体的区别
分析情况:在Shiro底层进行调用的过程中,身份验证和授权验证 都会尝试从缓存中取出数据。
使用debug进行调试:发现身份验证和授权验证 都会调用自定义Cache的get和put方法,并且两种验证过程传给自定义Cache的get和put方法的参数key是相同的。
底层第一步:
登陆: 登陆时首先会调用 getAuthenticationCacheKey(AuthenticationToken token)
获取key,然后尝试从缓存中获取到AuthenticationInfo 不用想,第一次缓存中是没有数据的 所以肯定拿不到数据,因为info为null 所以继续调用自定义Realm的doGetAuthenticationInfo方法从数据库中查询到信息并返回,之后使用自定义Cache的put方法将查询到的AuthenticationInfo缓存起来
第二步:
授权验证,授权验证第一步首先调用getAuthorizationCacheKey(principals)
不论是手动验证还是通过控制器方法上的注解进行验证,他们的第一步总是从缓存中拿到 AuthorizationInfo
这时 就要 注意 注意 注意了 因为第一步缓存了一个key=zhansan value类型为AuthenticationInfo的值,然后验证过程想要拿到一个AuthorizationInfo 类型的value,结果却拿到了第一步的AuthenticationInfo 自然就出现类型转换的异常了
解决方案:
想到这里就明白了,无非是因为身份验证和授权验证时,用到的key都是zhangsan导致出现数据覆盖等问题,那么重写getAuthenticationCacheKey(AuthenticationToken token)或者getAuthorizationCacheKey(principals) 就行了
标签:缓存,自定义,验证,调用,key,apache,org,AuthenticationInfo,shiro 来源: https://blog.csdn.net/qq_45593903/article/details/123615383
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。