You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>,构造模拟请求传入校验即可

注意:如果你的项目用到了方法级权限注解(比如@PreAuthorize、@Secured),可以额外注入MethodSecurityInterceptor,传入对应HandlerMethod做校验,覆盖方法级权限规则。


方案2:自定义权限元数据缓存(适合高并发场景,性能更高)

如果你的项目权限规则是统一管控的(比如接口权限码和路径绑定存在配置中心/数据库),可以用这个方案提升查询性能:

  • 项目启动时,自定义扫描器遍历所有带@RequestMapping(含派生注解@GetMapping/@PostMapping等)的方法,提取每个接口对应的权限码、请求路径、请求方法,缓存到本地。
  • 用户查询可用Endpoint列表时,直接拉取当前用户的权限集合,和缓存的接口权限码做匹配过滤即可。
  • 新增Endpoint或者权限规则变动时,触发缓存刷新逻辑即可,不需要修改硬编码列表。

常见问题说明

  • 你之前尝试的EndpointListener、Spring-Actuator、Swagger本身设计就是返回全量Endpoint,不会集成Spring Security的权限元数据,所以无法直接过滤出用户有权限的接口是正常现象。
  • 不要自行解析@PreAuthorize等注解的SpEL表达式,表达式支持的语法非常灵活,自行解析很容易出现和实际校验逻辑不一致的问题,复用Spring原生校验组件是最稳妥的方案。

内容的提问来源于stack exchange,提问作者Azyrael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:09:05