| name | analyze-auth |
| description | Java 项目鉴权分析。Step 1 使用 JetBrains 工具查找所有 Filter、Interceptor 及安全框架配置,分析作用范围和执行顺序。Step 2 逐个分析路由端点的鉴权状态,按 preauth/postauth 分类输出。用于:鉴权架构分析、未授权端点发现。触发词:analyze auth、鉴权分析、认证分析、filter interceptor、Phase 2。 |
鉴权分析 (Phase 2)
适用场景
- Java Web 项目审计中,需要分析鉴权机制和路由鉴权状态
- 作为
java-audit Phase 2 被调度执行
不适用场景
- 项目无路由信息 → 先执行
find-route
- 需要追踪漏洞调用链 → 使用
trace-sink 或 trace-preauth
前置条件
- Serena MCP 已连接,目标项目已激活
.audit/routes.json 已存在(由 find-route 生成)
.audit/recon.md 已存在
反幻觉铁律
1. Filter/Interceptor 源码必须通过 jet_brains_find_symbol(include_body=true) 实际读取
2. URL 匹配规则必须从代码或配置中提取,不得推测
3. 鉴权判定必须有明确依据(注解、URL pattern、配置)
工作流程
Step 1: Filter/Interceptor 发现与分析
1.1 查找 Filter
- 调用
jet_brains_type_hierarchy("javax.servlet.Filter", hierarchy_type="sub") 查找所有 Filter 实现类
- 同时搜索
jakarta.servlet.Filter 子类
- 调用
jet_brains_type_hierarchy("org.springframework.web.filter.OncePerRequestFilter", hierarchy_type="sub") 查找 Spring Filter
- 调用
search_for_pattern("@WebFilter") 搜索注解定义的 Filter
- 读取
web.xml(如有)提取 <filter-mapping> 配置
- 调用
search_for_pattern("FilterRegistrationBean") 查找 Spring Boot 注册方式
1.2 查找 Interceptor
- 调用
jet_brains_type_hierarchy("org.springframework.web.servlet.HandlerInterceptor", hierarchy_type="sub")
- 调用
jet_brains_type_hierarchy("org.springframework.web.servlet.handler.HandlerInterceptorAdapter", hierarchy_type="sub")
- 调用
search_for_pattern("addInterceptors") 查找 WebMvcConfigurer 中的拦截器注册
1.3 查找安全框架配置
- Shiro:
search_for_pattern("ShiroFilterFactoryBean|filterChainDefinitionMap|shiroFilter")
- Spring Security:
search_for_pattern("SecurityFilterChain|WebSecurityConfigurerAdapter|HttpSecurity|@EnableWebSecurity")
- 自定义注解:
search_for_pattern("@RequiresAuthentication|@PermitAll|@Anonymous|@NoAuth|@LoginRequired")
1.4 分析每个 Filter/Interceptor
对每个发现的 Filter/Interceptor:
- 调用
jet_brains_find_symbol(name, include_body=true) 读取完整源码
- 分析以下内容:
- URL 匹配模式: include patterns 和 exclude patterns
- 鉴权逻辑: 检查 session/token/cookie 的方式
- 执行顺序:
@Order 注解值或配置中的顺序
- 放行条件: 哪些 URL 或条件下直接放行
Step 2: 路由鉴权判定
对 .audit/routes.json 中每个路由类:
- 调用
jet_brains_find_symbol(class_name, include_body=true) 或 jet_brains_get_symbols_overview 获取所有方法
- 提取每个方法的路由注解(
@GetMapping、@PostMapping、@RequestMapping 等)
- 拼接完整路由路径 =
类级别路径 + 方法级别路径
- 不需要分析方法体内容,仅关注:
- 方法上的鉴权注解(
@PermitAll、@Anonymous、@RequiresPermissions 等)
- 完整路径是否匹配 Filter/Interceptor 的 exclude patterns
- 安全框架配置中是否对该路径放行
- 判定为 preauth(无需鉴权)或 postauth(需要鉴权)
Step 3: 输出结果
输出文件 1: .audit/auth-analysis.md
包含所有分析内容的完整报告:
# 鉴权分析报告
## 1. 安全框架
- 框架类型:shiro / spring_security / custom / none
## 2. Filter 链
| # | Filter 名称 | 类名 | Order | URL Pattern | Exclude Pattern | 鉴权类型 |
|---|------------|------|-------|-------------|-----------------|----------|
| 1 | AuthFilter | com.example.AuthFilter | 1 | /* | /login, /public/* | token_check |
### Filter 详细分析
#### AuthFilter
- 源码位置:...
- 鉴权逻辑:...
- 放行规则:...
## 3. Interceptor 链
(同 Filter 格式)
## 4. Preauth 路由(无需鉴权)
| # | HTTP方法 | 完整路径 | 类名 | 方法名 | 判定原因 |
|---|---------|---------|------|--------|---------|
| 1 | GET | /api/public/info | PublicController | getInfo | 匹配 AuthFilter exclude /public/* |
## 5. Postauth 路由(需要鉴权)
| # | HTTP方法 | 完整路径 | 类名 | 方法名 | 鉴权条件 |
|---|---------|---------|------|--------|---------|
| 1 | POST | /api/user/update | UserController | updateUser | JWT Token + role=USER |
输出文件 2: .audit/preauth-routes.json
仅包含 preauth 路由的 JSON 文件,供后续 trace-preauth 使用:
{
"preauth_routes": [
{
"path": "GET /api/public/info",
"class": "com.example.PublicController",
"method": "getInfo",
"reason": "匹配 AuthFilter exclude pattern /public/*"
}
]
}
注意事项
- Filter 的 url-pattern
/* 匹配所有路径,但 exclude 列表可能豁免部分路径
- Shiro 的
anon 配置表示无需鉴权,authc 表示需要认证
- Spring Security 的
permitAll() 表示无需鉴权
- 某些项目可能同时使用多种鉴权机制(如 Shiro + 自定义 Filter),需综合判断
- 静态资源路径(
/static/**、/css/**)通常为 preauth,但也需确认