Java函数式接口通过封装权限校验逻辑(如PermissionChecker)、结合AOP自定义注解、支持and/or/not组合及与SpEL分层协作,实现灵活可复用的权限控制。

Java 中函数式接口本身不直接实现权限校验,而是作为灵活、可组合的策略抽象工具,配合 Spring Security 或自定义拦截逻辑,把“校验逻辑”变成可传递、可复用的一等公民。
用函数式接口封装校验规则
定义一个 @FunctionalInterface,比如 PermissionChecker,它接收当前用户(或上下文)并返回布尔值:
@FunctionalInterface<br>public interface PermissionChecker {<br> boolean hasPermission(Authentication auth, String resource, String action);<br>}
然后你可以用 Lambda 或方法引用快速创建具体规则:
(auth, res, act) -> "ADMIN".equals(auth.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(",")))-
this::hasRoleAdmin(指向已有方法) -
PermissionCheckers.hasPermissionOnResource("order", "delete")(工厂方法返回预配置的 Checker)
与 Spring AOP 或注解结合做运行时校验
写一个自定义注解(如 @RequirePermission),再用 AOP 拦截方法调用。切面中从注解提取资源/动作,并传给注入的 PermissionChecker 实例执行判断:
立即学习“Java免费学习笔记(深入)”;
- 注解支持属性如
resource = "user"、action = "write" - AOP 方法里获取当前
Authentication,调用checker.hasPermission(...) - 校验失败抛出
AccessDeniedException,由 Spring 统一处理
组合多个校验逻辑(and/or/not)
利用函数式接口天然支持函数组合的特性,通过默认方法增强可组合性:
default PermissionChecker and(PermissionChecker other) {<br> return (auth, r, a) -> this.hasPermission(auth, r, a) && other.hasPermission(auth, r, a);<br>}<br><br>default PermissionChecker or(PermissionChecker other) {<br> return (auth, r, a) -> this.hasPermission(auth, r, a) || other.hasPermission(auth, r, a);<br>}
这样就能写出清晰语义的校验链:
adminChecker.or(ownerChecker).and(activeTenantChecker)- 避免硬编码 if-else 嵌套,提升可读性和测试性
与 Spring Expression Language(SpEL)互补使用
函数式接口适合封装复杂、复用性强的业务校验(如租户隔离、数据归属判断),而 SpEL 更适合简单表达式(如 #auth.roles.contains('ADMIN'))。两者可以分层协作:
- 在
@PreAuthorize中调用 Spring Bean 的方法:@PreAuthorize("@permissionService.canEditOrder(#id, #auth)") - 该 service 方法内部使用函数式接口组合多种 Checker,对外只暴露统一入口


















