浅谈Apache Shiro请求解析过程
字数 2227 2025-08-06 12:20:51

Apache Shiro请求解析过程深度解析

0x00 Apache Shiro概述

Apache Shiro是Java的一个安全框架,主要用于处理:

  • 身份认证
  • 授权
  • 企业会话管理
  • 加密

与Spring Security相比,Shiro具有更简洁易懂的认证和授权方式。其核心功能通过过滤器链实现。

0x01 Shiro请求解析流程

1.1 整体流程

  1. 入口点org.apache.shiro.spring.web.ShiroFilterFactoryBean.SpringShiroFilter

    • 继承自OncePerRequestFilter,确保每个请求只执行一次
  2. 请求处理流程

    • 进入OncePerRequestFilter.doFilter()
    • 调用AbstractShiroFilter.doFilterInternal()
    • 包装request和response对象
    • 调用createSubject()处理认证授权信息
    • 创建并执行过滤器链

1.2 过滤器链创建

PathMatchingFilterChainResolver.getChain()负责:

  1. 获取请求URI的相对路径
  2. 匹配配置的过滤器规则
  3. 返回需要执行的过滤器链

关键方法

  • getPathWithinApplication():获取应用程序内URI的相对路径
  • removeSemicolon():移除URI中的分号
  • normalize():规范化URI路径

1.3 过滤器执行

过滤器链执行顺序:

  1. InvalidRequestFilter(默认全局过滤器)
  2. 配置的特定过滤器(如authc

每个过滤器通过AdviceFilter.doFilterInternal()执行:

  • 调用preHandle()
  • 执行onPreHandle()
  • 根据返回值决定是否继续执行后续过滤器

0x02 关键组件分析

2.1 PathMatchingFilterChainResolver

核心功能

  • URL路径匹配
  • 解析请求过程中要执行的过滤器链

URI处理流程

  1. 获取ServletPath + PathInfo
  2. 移除分号
  3. 规范化路径:
    • 处理双斜杠(///)
    • 归一化处理(/.//)
    • 处理路径跳跃(/a/../b/b)
  4. 移除尾部斜杠

匹配规则

  • 使用AntPathMatcher进行模式匹配
  • 配置的规则必须以/开头才能生效

2.2 AntPathMatcher

匹配过程

  1. 将pattern和path分割成String数组
  2. 使用StringTokenizer处理字符串
  3. 支持trimTokens属性(控制是否消除空格)

版本差异

  • 1.7.1之前:trimTokens默认为true
  • 1.7.1及之后:trimTokens默认为false

2.3 ShiroUrlPathHelper

作用

  • 保持Spring和Shiro路径解析逻辑一致
  • 重写getPathWithinApplication()方法

实现细节

  1. 获取ServletPathPathInfo
  2. 调用removeSemicolon()normalize()处理
  3. PathMatchingFilterChainResolver逻辑一致

2.4 InvalidRequestFilter

功能

  • 拦截存在安全问题的URI
  • 返回400状态码

检查项

  1. 检查URI是否有效:
    • 非空且非空白字符
  2. 检查是否包含:
    • 分号(;, %3b, %3B)
    • 反斜杠(\, %5c, %5C)
    • 非ASCII字符

0x03 重要配置注意事项

  1. 路径规则配置

    • 必须以/开头(如/admin/*
    • 否则匹配会失效
  2. 版本兼容性

    • Shiro 1.11.0之前只兼容Ant-style路径匹配
    • 与Spring Boot 2.6+的PathPatternParser存在兼容问题
  3. 安全过滤器

    • 从1.6.0开始默认启用InvalidRequestFilter
    • 对所有请求进行基本安全检查

0x04 常见问题解析

  1. 为什么配置admin/page不生效?

    • 规则必须以/开头
    • 正确配置应为/admin/page
  2. Spring和Shiro路径匹配差异

    • Spring会自动补全开头的/
    • Shiro不会自动补全,必须显式配置
  3. 高版本Spring Boot兼容问题

    • Shiro 1.11.0+通过ShiroRequestMappingConfig强制使用AntPathMatcher
    • 确保路径匹配模式一致

0x05 最佳实践建议

  1. 规则配置

    • 始终使用以/开头的路径规则
    • 明确指定匹配模式(如/admin/**
  2. 版本选择

    • 使用Shiro 1.11.0+与Spring Boot 2.6+配合
    • 确保路径匹配模式一致
  3. 安全加固

    • 不要禁用InvalidRequestFilter
    • 根据业务需求添加额外安全检查
  4. 调试技巧

    • PathMatchingFilterChainResolver.getChain()设置断点
    • 检查实际匹配的过滤器链

通过深入理解Shiro的请求解析过程,可以更有效地配置安全规则,避免常见的安全隐患和配置错误。

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 对所有请求进行基本安全检查 0x04 常见问题解析 为什么配置 admin/page 不生效? 规则必须以 / 开头 正确配置应为 /admin/page Spring和Shiro路径匹配差异 : Spring会自动补全开头的 / Shiro不会自动补全,必须显式配置 高版本Spring Boot兼容问题 : Shiro 1.11.0+通过 ShiroRequestMappingConfig 强制使用 AntPathMatcher 确保路径匹配模式一致 0x05 最佳实践建议 规则配置 : 始终使用以 / 开头的路径规则 明确指定匹配模式(如 /admin/** ) 版本选择 : 使用Shiro 1.11.0+与Spring Boot 2.6+配合 确保路径匹配模式一致 安全加固 : 不要禁用 InvalidRequestFilter 根据业务需求添加额外安全检查 调试技巧 : 在 PathMatchingFilterChainResolver.getChain() 设置断点 检查实际匹配的过滤器链 通过深入理解Shiro的请求解析过程,可以更有效地配置安全规则,避免常见的安全隐患和配置错误。