Java模块化安全策略核心是JPMS封装与运行时控制,而非SecurityManager;需在module-info.java中精确exports/opens、JVM参数限制非法反射、集成JAAS实现模块感知授权、通过模块图验证防篡改。

Java 模块化应用中的安全权限策略,核心是依托 JPMS(Java Platform Module System)的封装机制与运行时访问控制,而非依赖已废弃的 SecurityManager。配置重点在于模块声明、反射管控、最小权限导出和启动参数约束,不是写 policy 文件或启用旧式安全管理器。
1. 在 module-info.java 中精确控制包可见性
模块默认强封装——所有包都不对外暴露。必须显式用 exports 和 opens 控制访问边界:
-
只导出 API 包:敏感实现包(如
internal、impl)绝不exports -
反射访问需单独授权:用
opens com.example.internal to com.example.audit限定哪些模块可反射访问该包 -
避免全开:禁用
opens com.example.internal(无目标模块),否则等同于放弃封装
2. 启动时启用强封装并限制非法反射
JDK 16+ 默认拒绝非法反射,但某些框架仍需兼容。应通过 JVM 参数明确策略:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
--illegal-access=deny:彻底禁止非法反射(推荐生产环境) -
--add-opens java.base/java.lang=ALL-UNNAMED:仅对必需模块/类加载器开放特定包(如测试框架需要) -
--enable-native-access=ALL-UNNAMED:仅在确需 JNI 调用时启用,且应替换为具体模块名
3. 结合 JAAS 或自定义上下文实现运行时授权
模块系统不替代业务级权限,但可与 JAAS 集成,让权限检查感知模块来源:
立即学习“Java免费学习笔记(深入)”;
- 在
LoginModule中获取当前执行模块(通过StackWalker或ModuleLayer) - 根据模块名、签名或代码源(
CodeSource)动态加载对应策略 - 使用
AccessController.doPrivileged配合ProtectionDomain实现细粒度操作授权
4. 利用模块图验证防止运行时篡改
JVM 启动时会解析并验证模块图一致性。可主动强化校验逻辑:
- 在
premain或启动类中调用ModuleLayer.boot().modules()检查关键模块是否被替换 - 对敏感模块(如安全服务模块)验证其
ModuleDescriptor.Version和ModuleDescriptor.Requires是否符合预期 - 结合 JAR 签名(
jarsigner)与模块requires static声明,确保依赖不可被降级或劫持

















