Gateway 鉴权场景:网关统一鉴权 + 业务应用决定放行规则
目录一、核心设计原则一句话总结二、具体实现方案最主流、最推荐1. 整体流程2. 具体技术实现Spring Cloud Gateway 为例1业务服务定义注解 扫描接口路由2业务服务启动时自动上报路由权限规则3Gateway拉取规则 全局过滤器统一鉴权三、更轻量的简化方案中小型项目常用四、为什么要这么设计面试加分回答五、面试标准回答你可以直接背总结这是微服务架构中最标准、最常用的鉴权方案Gateway 只做「鉴权执行」业务服务只做「放行规则配置」职责完全解耦。本文直接给你讲企业落地的通用实现方案清晰、可直接面试回答也能直接开发用。一、核心设计原则一句话总结Gateway 不关心业务只做 “校验 token 是否有效 是否需要放行”业务服务定义 “哪些接口公开、哪些需要权限”把规则告诉 Gateway。二、具体实现方案最主流、最推荐1. 整体流程业务服务如订单、用户服务在自己的接口上标注权限注解如Anonymous免鉴权、RequireRole(ADMIN)。业务服务启动时把接口权限规则自动上报到配置中心 / 数据库。Gateway 实时拉取规则知道哪些路径不需要登录、哪些需要什么角色 / 权限。请求进入 Gateway匹配规则 → 公开接口直接放行私有接口校验 Token → 无效直接拦截 → 有效则转发2. 具体技术实现Spring Cloud Gateway 为例1业务服务定义注解 扫描接口路由业务服务自己决定哪些接口不用登录// 免登录注解业务服务定义 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface Anonymous { } // 控制器里使用 RestController RequestMapping(/user) public class UserController { // 登录接口 → 业务决定免鉴权 Anonymous PostMapping(/login) public Result login() {} // 获取用户信息 → 需要鉴权 GetMapping(/info) public Result info() {} }2业务服务启动时自动上报路由权限规则项目启动时扫描所有Anonymous、RequirePermission注解 把URL 是否需要鉴权 需要的权限上报到Nacos / Apollo配置中心或 Redis / MySQL示例上报格式Gateway 能读懂[ { url: /user/login, auth: false }, { url: /user/info, auth: true, roles: [USER] }, { url: /order/**, auth: true, perms: [order:query] } ]3Gateway拉取规则 全局过滤器统一鉴权Gateway 只做一件事拿请求路径 → 匹配规则 → 决定是否校验 Token核心过滤器伪代码Component public class AuthFilter implements GlobalFilter { Autowired private AuthRuleService authRuleService; // 拉取业务服务上报的规则 Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 1. 获取当前请求路径 String path exchange.getRequest().getPath().toString(); // 2. 查询规则是否需要鉴权由业务服务决定 AuthRule rule authRuleService.getRule(path); // 3. 业务说不需要鉴权 → 直接放行 if (!rule.isAuth()) { return chain.filter(exchange); } // 4. 需要鉴权 → Gateway 执行校验Token、签名、过期等 String token exchange.getRequest().getHeader(token); if (!JwtUtil.verify(token)) { return unauthorizedResponse(exchange); } // 5. 校验通过 → 转发 return chain.filter(exchange); } }三、更轻量的简化方案中小型项目常用如果不想做「自动上报」可以用配置文件模式同样满足业务决定放行规则Gateway 只执行。每个业务服务提供一个white-list.ymlanonymous: urls: - /user/login - /file/upload/**交给 Gateway 加载Gateway 统一拦截、放行、鉴权优点简单、稳定、无侵入。缺点不能自动扫描注解需要手动维护但很多公司就这样用。四、为什么要这么设计面试加分回答职责分离Gateway只做通用安全拦截无业务逻辑业务服务只做自身接口权限定义扩展性强新增服务 → 只需要业务配置规则Gateway 完全不用改统一安全入口所有鉴权收口在网关避免业务服务漏写鉴权性能更好非法请求在网关层直接拦截不会打到后端服务五、面试标准回答你可以直接背我们的方案是Gateway 统一负责鉴权逻辑的执行业务服务负责定义哪些接口需要鉴权、哪些不需要。具体实现业务服务通过注解如 Anonymous标记公开接口服务启动时自动扫描接口把权限规则上报到配置中心或 RedisGateway 实时拉取所有服务的权限规则请求进入网关后根据规则判断是否需要鉴权需要则校验 Token不需要直接放行。这种模式做到了权限控制在业务鉴权执行在网关职责清晰、易于维护。总结控制权分离Gateway 执行鉴权业务服务定义规则实现方式注解 规则上报 Gateway 全局过滤器优点解耦、统一入口、易扩展、安全两种方案自动上报大型项目、配置白名单中小型项目