Java/Spring Boot项目如何获取当前用户有权限访问的Endpoint列表
解决方案
方案1:基于Spring Security原生API动态校验(适配大部分场景,无兼容问题)
这个方案直接复用Spring本身的权限校验逻辑,不需要硬编码权限规则,和实际接口访问的权限判断结果完全一致:
- 第一步:注入
RequestMappingHandlerMapping实例,调用getHandlerMethods()方法拿到全量注册的Endpoint映射元数据,包含请求路径、请求方法、对应处理方法等所有信息,比Actuator、Swagger返回的结果更全面准确。 - 第二步:从
SecurityContextHolder.getContext().getAuthentication()获取当前登录用户的身份、权限集合信息。 - 第三步:遍历所有Endpoint元数据,使用Spring Security原生的校验组件逐个校验访问权限:
- Spring Security 5及以下版本:注入
AccessDecisionManager,构造FilterInvocation对象传入校验即可 - Spring Security 6及以上版本:注入
AuthorizationManager<HttpServletRequest>,构造模拟请求传入校验即可
- Spring Security 5及以下版本:注入
注意:如果你的项目用到了方法级权限注解(比如
@PreAuthorize、@Secured),可以额外注入MethodSecurityInterceptor,传入对应HandlerMethod做校验,覆盖方法级权限规则。
方案2:自定义权限元数据缓存(适合高并发场景,性能更高)
如果你的项目权限规则是统一管控的(比如接口权限码和路径绑定存在配置中心/数据库),可以用这个方案提升查询性能:
- 项目启动时,自定义扫描器遍历所有带
@RequestMapping(含派生注解@GetMapping/@PostMapping等)的方法,提取每个接口对应的权限码、请求路径、请求方法,缓存到本地。 - 用户查询可用Endpoint列表时,直接拉取当前用户的权限集合,和缓存的接口权限码做匹配过滤即可。
- 新增Endpoint或者权限规则变动时,触发缓存刷新逻辑即可,不需要修改硬编码列表。
常见问题说明
- 你之前尝试的EndpointListener、Spring-Actuator、Swagger本身设计就是返回全量Endpoint,不会集成Spring Security的权限元数据,所以无法直接过滤出用户有权限的接口是正常现象。
- 不要自行解析
@PreAuthorize等注解的SpEL表达式,表达式支持的语法非常灵活,自行解析很容易出现和实际校验逻辑不一致的问题,复用Spring原生校验组件是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Azyrael
相关产品推荐
相关产品推荐

