1. SpringBoot多注解权限访问机制解析
在基于SpringBoot的后端开发中,权限控制是保障系统安全性的核心环节。实际业务场景中经常遇到这样的需求:某个接口需要同时满足多种权限条件中的任意一个即可访问。这种"或"逻辑的权限校验,正是@PreAuthorize注解配合SpEL表达式的典型应用场景。
1.1 权限注解的工作原理
Spring Security的@PreAuthorize注解会在方法调用前执行权限校验,其核心机制是通过MethodSecurityInterceptor拦截器实现的。当我们在Controller方法上添加如下注解时:
java复制@PreAuthorize("@ss.hasPermi('odm:design:list') or @ss.hasPermi('odm:odmProject:list')")
系统会依次执行以下流程:
- 解析SpEL表达式中的
@ss对象(通常是一个自定义的权限服务Bean) - 调用
hasPermi方法校验第一个权限标识odm:design:list - 如果第一个校验不通过,继续校验第二个权限标识
odm:odmProject:list - 任意一个权限校验通过即允许访问,全部失败则抛出
AccessDeniedException
提示:这里的
ss是自定义权限服务的Bean名称,实际开发中应根据项目规范命名,常见的有permissionService、authService等
1.2 权限标识的设计规范
权限标识符odm:design:list采用常见的三段式设计:
- 系统模块(odm):标识所属业务系统或大模块
- 功能模块(design):标识具体功能模块
- 操作类型(list):标识操作类型(list/view/add/edit等)
这种设计的好处在于:
- 层级清晰,便于维护和查询
- 支持模糊匹配,如
odm:design:*可表示设计模块所有权限 - 与前端菜单权限天然对应
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多权限校验的完整实现方案
2.1 基础环境配置
首先确保项目中已正确配置Spring Security和方法级安全控制:
java复制@Conf
