exports to 不是微服务权限控制语法,而是 java 9+ 模块系统中限制包可见性的静态声明,仅影响类加载,不参与业务鉴权;真正的字段级权限需通过网关脱敏、@sensitive 注解、动态sql过滤和响应裁剪实现。

一、Java 模块系统中的 exports to 是什么?
这是 JPMS(Java Platform Module System)的语法,用于限制包的导出范围:
-
作用域极窄:只控制“类能否被其他模块的代码
import和反射访问”,不涉及用户身份、角色、Token、HTTP 请求、数据库字段或业务逻辑。 -
静态绑定:在
module-info.java中硬编码声明,无法动态开关、按用户/租户/环境差异化配置。 - 不适用于微服务权限场景:比如你无法用它实现“张三能读 user.name,李四只能读 user.id”,也无法拦截 REST 调用或 Feign 远程调用。
二、微服务中真正有效的“核心变量级”权限控制怎么做?
所谓“核心变量”(如用户手机号、订单金额、身份证号)的访问控制,属于数据级权限(Data-Level Authorization),需结合以下分层策略:
- 网关层脱敏:在 API 网关(如 pig-gateway 或 Spring Cloud Gateway)中解析 JWT/Token,识别用户角色和数据权限范围(如所属部门、数据分级标签),对响应体中敏感字段做动态掩码(如手机号显示为 138****1234)。
-
服务层字段级注解:在 DTO 或 VO 类字段上加自定义注解(如
@Sensitive(level = "L3")),配合 AOP 或 Jackson 序列化器,在序列化时根据当前用户上下文决定是否输出或脱敏。 -
DAO 层动态 SQL 过滤:使用 MyBatis-Plus 的自动填充或自定义拦截器,在查询 SQL 中注入数据权限条件(如
AND dept_id IN (SELECT dept_id FROM sys_user_dept WHERE user_id = ?)),确保“查不到即不可见”。 -
Redis 缓存隔离:不同租户/角色的数据缓存 key 带命名空间前缀(
user:tenantA:1001),避免跨租户误读;敏感字段单独缓存并设置更短 TTL。
三、推荐落地组合(已验证生产可用)
以 RuoYi-Cloud 或 pig 为基础,快速启用字段级控制:
- 在
sys_user表增加sensitive_level字段,标识手机号、邮箱等字段的敏感等级; - 前端请求头携带
X-Data-Scope: tenantA或X-Auth-Role: finance-auditor; - 后端统一响应处理器(
@ControllerAdvice)扫描返回对象字段,匹配@Sensitive注解 + 当前角色策略,自动脱敏; - 关键服务(如用户中心)暴露
/user/{id}/profile?fields=name,phone,email接口,后端校验该用户是否有权获取所请求的每个字段。











