Java模块访问权限异常:Spring Security配置相关问题排查
问题排查与解决方法
错误根源分析
这个InaccessibleObjectException并非Spring Security的requestMatchers配置问题,而是Java模块系统的权限限制导致的:Java 9+的模块化机制中,java.net.http模块没有向未命名模块(unnamed module)开放java.net.http包,使得反射无法访问HttpRequest的protected构造方法。
具体解决步骤
1. 添加JVM启动参数开放模块权限
直接在JVM启动时添加参数,允许未命名模块访问java.net.http包:
--add-opens java.net.http/java.net.http=ALL-UNNAMED
- 如果用Maven运行,在
pom.xml的Spring Boot插件中配置:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>--add-opens java.net.http/java.net.http=ALL-UNNAMED</jvmArguments> </configuration> </plugin> </plugins> </build> - 如果是IDE运行,在运行配置的VM options中添加上述参数。
2. 排查触发反射的依赖/代码
检查项目中以下部分:
- 自定义的
jwtService实现:是否在解析JWT或调用外部服务时使用了java.net.http.HttpRequest,且通过反射创建实例? - 第三方HTTP客户端依赖:是否使用了旧版本的库,这些库依赖反射访问
java.net.http的内部API?尝试升级这些依赖到适配Java模块化的版本。
3. 验证Spring Security配置(排除疑虑)
你的requestMatchers("/api/v1/auth/**").permitAll()配置是正确的,且JWT过滤器中已通过request.getServletPath().contains("/api/v1/auth")跳过了该路径的认证处理。可以在过滤器的判断分支添加日志,确认请求是否被正确放行:
if(request.getServletPath().contains("/api/v1/auth")){ System.out.println("放行/auth路径请求:" + request.getServletPath()); filterChain.doFilter(request,response); return; }
内容的提问来源于stack exchange,提问作者Thiu Lễ Văn
相关产品推荐
相关产品推荐

