注解仅作元数据标记,不执行权限判定;通过apt在编译期生成权限映射表和策略注册类,运行时由branchawarepermissionevaluator结合组织树路径匹配完成校验。

这其实不是靠“注解”本身完成权限判定,而是用注解作为元数据标记,配合编译期处理工具(如注解处理器APT)生成权限校验逻辑或策略配置。真正的判定发生在运行时,但规则源头和结构约束在编译期就已固化——尤其适用于组织架构固定、分支角色明确、权限边界清晰的集团型系统。
明确注解用途:标记而非执行
Java 中的注解(@interface)默认不带执行能力。你需要定义两类注解:
-
@OrgBranch:标注在类或接口上,声明该组件服务于某组织分支(如
branchCode = "SZ-IT"、level = "sub-company"); -
@BranchPermission:标注在方法或字段上,指定所需分支上下文(如
requiredBranches = {"SZ-IT", "SH-FIN"}、minLevel = "department")。
它们不参与运行时拦截,只作为“静态契约”供后续处理。
用注解处理器生成权限骨架代码
编写一个 javax.annotation.processing.Processor,在编译时扫描上述注解,并输出两类产物:
- 一份 JSON 或 YAML 格式的权限映射表(如
branch-permissions.yml),记录每个服务类/方法绑定的组织分支要求; - 一个自动生成的
BranchPolicyRegistry类,内含静态初始化块,将上述规则预加载进内存缓存(避免运行时反射开销)。
这样,启动时就能直接读取编译期生成的策略,无需解析注解,也规避了反射性能损耗。
与运行时权限引擎对接
生成的策略需被运行时模块消费。例如,在 Spring 环境中:
- 定义一个
BranchAwarePermissionEvaluator,实现PermissionEvaluator接口; - 在
hasPermission()方法中,根据当前用户所属组织分支(从SecurityContext或ThreadLocal获取),查表比对方法标注的@BranchPermission要求; - 支持层级继承判断(如用户属于
SZ-IT-DEV,可自动匹配SZ-IT的策略)。
关键点:编译期不决定“是否允许”,只固化“哪些分支能触发哪条规则”——判定动作仍由运行时策略引擎完成,确保上下文(如时间、IP)可参与决策。
适配多级组织树的结构化建模
组织分支不是扁平标签,而是有父子关系的树。建议在注解中引入路径式表达:
@OrgBranch(path = "/CN/SZ/IT/DEV")@BranchPermission(requiredPaths = {"/CN/SZ/IT", "/CN/SH/FIN"})
生成器据此构建前缀树(Trie)或路径匹配索引,使运行时能快速判断 /CN/SZ/IT/DEV 是否满足 /CN/SZ/IT 的权限要求,天然支持“上级授权覆盖下级”的语义。










