多态通过接口抽象权限校验行为,将规则分散到各实现类(如AdminChecker、OwnerChecker),支持组合与AOP织入,实现解耦、可扩展和透明化校验。

多态本身不直接做权限校验,而是把“谁有权限、凭什么有、怎么判断”这些变化点从主流程中抽出来,让每个角色或场景自己决定规则,而不是靠一堆 if-else 去硬匹配。
用接口统一抽象校验行为
定义一个函数式接口(比如 PermissionChecker),只暴露一个核心方法:boolean hasPermission(Authentication auth, String resource, String action)
所有具体校验逻辑——如管理员全通、数据归属判断、租户隔离、审批链状态检查——都由不同实现类各自封装。调用方只管传入 checker 实例并调用,完全不用知道背后是哪种规则。
按角色或场景拆分实现类
每个校验维度对应一个独立实现类,例如:
- AdminChecker:只检查是否含 ADMIN 权限
- OwnerChecker:比对当前用户 ID 与资源 owner 字段
- TenantChecker:验证 tenantId 是否匹配当前上下文
- ApprovalStageChecker:结合流程实例状态和当前节点判断可操作性
新增一类校验(比如“仅限最近7天创建的数据”),只需加一个新类,不改任何已有代码。
组合与复用校验逻辑
在接口中添加默认方法支持逻辑组合:
立即学习“Java免费学习笔记(深入)”;
-
and(PermissionChecker other):两个条件都满足才通过 -
or(PermissionChecker other):任一满足即通过 -
not():取反
这样就能写出语义清晰的校验链:adminChecker.or(ownerChecker).and(activeTenantChecker)
既避免嵌套 if,也方便单元测试和动态配置。
配合 AOP 或注解做运行时织入
写一个自定义注解(如 @RequirePermission),标注在 Controller 或 Service 方法上;再用 AOP 切面拦截,从注解提取 resource/action,并交由注入的 PermissionChecker 执行判断。失败时统一抛 AccessDeniedException,由 Spring 全局处理。整个过程对业务方法透明,权限逻辑集中、可配、可测。


















