最近忙着研究在 Springboot 上使用 Shiro 的问题。刚好就遇到个诡异事,百度 Google 也没找到啥有价值的信息,几番周折自己解决了,这里稍微记录下。
自定义 Filter
Shiro 支持自定义 Filter 大家都知道,也经常用,这里我也用到了一个自定义 Filter,主要用于验证接口调用的 AccessToken 是否有效。
funny,结果出乎意料,居然登陆接口走了咱们的那个自定义 Filter??黑人问号脸。。。
问题排查 FilterChain
首先检查 Shiro FilterChain 加载的顺序是否异常。
1、集合容器使用 LinkedHashMap,保证的 FilterChain 的顺序。
2、从数据库读取 Filter 时也是按 sort 排序的。
从调试结果来看,加载顺序和数据并没有任何问题,都是正确的。
排除了自身的数据问题,那就要往深处挖掘原因了,有了之前解决 Quartz 问题的经历,这次毫不犹豫就决定跟源码跟踪 Filter 注册到匹配的过程。
Filter 注册
要查明白为何匹配异常,就要先弄清楚咱们的自定义 Filter 是如何注册到 Shiro 的,显然,问题的关键在于 ShiroFilter 返回的 ShiroFilterFactoryBean 这个类中,我们打开看看。很快,我们就锁定了关键 method: