shiro的session信息放redis反序列化异常解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro的session信息放redis反序列化异常解决相关的知识,希望对你有一定的参考价值。

参考技术A

背景
在本地session移至redis存储时,原本以为引入spring-session-data-redis依赖,配置RedisHttpSessionConfiguration,在web.xml中引入springSessionRepositoryFilter就结束了,没想到遇到序列化相关的问题,具体就是只有getter,没有setter。日志如下:

分析
提示很清楚,就是shiro的SimplePrincipalCollection类中realmNames字段没有setter方法,没法反序列化。
来看看realmNames是什么鬼,作为成熟的框架也偷懒不写setter?仔细一看,发现并不简单。类里面没有realmNames,只有个getRealmNames方法。
原来是个假getter,是由其他字段动态生成的,如下:

看下redis里面存的值

核心就是objectMapper.addMixIn()和objectMapper.setFilters()两个方法
SimplePrincipalCollection是需要处理的类,IncludShiroFields就是一个简单的接口,如下:

通过上面的配置间接控制SimplePrincipalCollection类中必要字段的序列化,从而解决了问题。
ps :因为使用了注解,一定要去掉objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false),不然配置不生效。

以上是关于shiro的session信息放redis反序列化异常解决的主要内容,如果未能解决你的问题,请参考以下文章

shiro java 反序列漏洞复现

shiro java 反序列漏洞复现

Java-Shiro:Shiro集成Redis实现Session统一管理

Java-Shiro:Shiro集成Redis实现Session统一管理

shiro(13)-JWT(Token的生成)

spring-session-data-redis反序列化问题