浅谈Apache Shiro请求解析过程
字数 2227 2025-08-06 12:20:51
Apache Shiro请求解析过程深度解析
0x00 Apache Shiro概述
Apache Shiro是Java的一个安全框架,主要用于处理:
- 身份认证
- 授权
- 企业会话管理
- 加密
与Spring Security相比,Shiro具有更简洁易懂的认证和授权方式。其核心功能通过过滤器链实现。
0x01 Shiro请求解析流程
1.1 整体流程
-
入口点:
org.apache.shiro.spring.web.ShiroFilterFactoryBean.SpringShiroFilter- 继承自
OncePerRequestFilter,确保每个请求只执行一次
- 继承自
-
请求处理流程:
- 进入
OncePerRequestFilter.doFilter() - 调用
AbstractShiroFilter.doFilterInternal() - 包装request和response对象
- 调用
createSubject()处理认证授权信息 - 创建并执行过滤器链
- 进入
1.2 过滤器链创建
PathMatchingFilterChainResolver.getChain()负责:
- 获取请求URI的相对路径
- 匹配配置的过滤器规则
- 返回需要执行的过滤器链
关键方法:
getPathWithinApplication():获取应用程序内URI的相对路径removeSemicolon():移除URI中的分号normalize():规范化URI路径
1.3 过滤器执行
过滤器链执行顺序:
InvalidRequestFilter(默认全局过滤器)- 配置的特定过滤器(如
authc)
每个过滤器通过AdviceFilter.doFilterInternal()执行:
- 调用
preHandle() - 执行
onPreHandle() - 根据返回值决定是否继续执行后续过滤器
0x02 关键组件分析
2.1 PathMatchingFilterChainResolver
核心功能:
- URL路径匹配
- 解析请求过程中要执行的过滤器链
URI处理流程:
- 获取
ServletPath+PathInfo - 移除分号
- 规范化路径:
- 处理双斜杠(
//→/) - 归一化处理(
/./→/) - 处理路径跳跃(
/a/../b→/b)
- 处理双斜杠(
- 移除尾部斜杠
匹配规则:
- 使用
AntPathMatcher进行模式匹配 - 配置的规则必须以
/开头才能生效
2.2 AntPathMatcher
匹配过程:
- 将pattern和path分割成String数组
- 使用
StringTokenizer处理字符串 - 支持
trimTokens属性(控制是否消除空格)
版本差异:
- 1.7.1之前:
trimTokens默认为true - 1.7.1及之后:
trimTokens默认为false
2.3 ShiroUrlPathHelper
作用:
- 保持Spring和Shiro路径解析逻辑一致
- 重写
getPathWithinApplication()方法
实现细节:
- 获取
ServletPath和PathInfo - 调用
removeSemicolon()和normalize()处理 - 与
PathMatchingFilterChainResolver逻辑一致
2.4 InvalidRequestFilter
功能:
- 拦截存在安全问题的URI
- 返回400状态码
检查项:
- 检查URI是否有效:
- 非空且非空白字符
- 检查是否包含:
- 分号(
;,%3b,%3B) - 反斜杠(
\,%5c,%5C) - 非ASCII字符
- 分号(
0x03 重要配置注意事项
-
路径规则配置:
- 必须以
/开头(如/admin/*) - 否则匹配会失效
- 必须以
-
版本兼容性:
- Shiro 1.11.0之前只兼容Ant-style路径匹配
- 与Spring Boot 2.6+的
PathPatternParser存在兼容问题
-
安全过滤器:
- 从1.6.0开始默认启用
InvalidRequestFilter - 对所有请求进行基本安全检查
- 从1.6.0开始默认启用
0x04 常见问题解析
-
为什么配置
admin/page不生效?- 规则必须以
/开头 - 正确配置应为
/admin/page
- 规则必须以
-
Spring和Shiro路径匹配差异:
- Spring会自动补全开头的
/ - Shiro不会自动补全,必须显式配置
- Spring会自动补全开头的
-
高版本Spring Boot兼容问题:
- Shiro 1.11.0+通过
ShiroRequestMappingConfig强制使用AntPathMatcher - 确保路径匹配模式一致
- Shiro 1.11.0+通过
0x05 最佳实践建议
-
规则配置:
- 始终使用以
/开头的路径规则 - 明确指定匹配模式(如
/admin/**)
- 始终使用以
-
版本选择:
- 使用Shiro 1.11.0+与Spring Boot 2.6+配合
- 确保路径匹配模式一致
-
安全加固:
- 不要禁用
InvalidRequestFilter - 根据业务需求添加额外安全检查
- 不要禁用
-
调试技巧:
- 在
PathMatchingFilterChainResolver.getChain()设置断点 - 检查实际匹配的过滤器链
- 在
通过深入理解Shiro的请求解析过程,可以更有效地配置安全规则,避免常见的安全隐患和配置错误。