Gateway鉴权控制权分配实现方案
目录场景需求拆解整体实现方案Spring Cloud Gateway 主流落地一、核心思路二、完整落地步骤1. 业务应用定义自身鉴权规则应用侧管控资源方案 A注解方式开发友好方案 B配置文件方式无需改代码运维可控2. 应用启动时将鉴权元数据上报至统一配置中心实现逻辑3. Gateway 监听配置中心加载全量鉴权规则4. Gateway 全局过滤器统一鉴权执行控制权在网关过滤器执行顺序三、补充优化方案可选方案 1不依赖配置中心服务主动注册元数据到网关缓存方案 2网关动态路由 内置鉴权 PredicateGateway 原生特性四、架构权责总结五、扩展边界场景场景需求拆解核心约束鉴权执行权统一在 Gateway所有校验逻辑、token 解析、签名校验、黑名单、限流统一由网关做业务服务不处理鉴权哪些接口需要鉴权由业务应用自主配置网关不能硬编码接口白名单 / 鉴权开关每个微服务自己定义哪些路径要登录、哪些免登。整体实现方案Spring Cloud Gateway 主流落地一、核心思路网关只做通用鉴权执行器鉴权范围接口清单从各业务服务同步到网关统一存储网关收到请求时先查当前接口是否需要鉴权需要则执行鉴权逻辑不需要直接放行。 分层职责应用服务维护自身接口鉴权元数据路径、是否需登录、权限码、角色要求配置中心 / Nacos统一存储全服务鉴权路由元数据Gateway读取元数据统一拦截、鉴权校验、转发。二、完整落地步骤1. 业务应用定义自身鉴权规则应用侧管控资源每个微服务提供两种方式暴露鉴权配置二选一即可方案 A注解方式开发友好自定义注解AuthRequiredjavaTarget({METHOD, TYPE}) Retention(RUNTIME) public interface AuthRequired { boolean needLogin() default true; // true要鉴权 false免登 String[] permissions() default {}; // 接口所需权限 String[] roles() default {}; // 所需角色 }Controller 使用javaRestController RequestMapping(/user) public class UserController { // 登录接口免登 PostMapping(/login) AuthRequired(needLogin false) public Result login(){} // 查询个人信息必须登录 GetMapping(/info) AuthRequired public Result getUserInfo(){} // 修改账号需要管理员权限 PutMapping(/update) AuthRequired(permissions {user:edit}, roles {admin}) public Result update(){} }方案 B配置文件方式无需改代码运维可控application.ymlauth: routes: - path: /user/login/** needLogin: false - path: /user/info/** needLogin: true - path: /user/update/** needLogin: true permissions: [user:edit]2. 应用启动时将鉴权元数据上报至统一配置中心实现逻辑服务启动后置处理器扫描所有AuthRequired接口 / 读取本地 auth 配置组装数据结构服务名、匹配路径、needLogin、权限、角色推送到 Nacos/Apollo 统一配置公共配置 Key 如gateway-auth-routesJSON 格式存储全服务鉴权规则。示例配置中心存储结构json[ { serviceId: user-service, pathPattern: /user/login/**, needLogin: false, permissions: [], roles: [] }, { serviceId: user-service, pathPattern: /user/update/**, needLogin: true, permissions: [user:edit], roles: [admin] } ]优势业务改接口鉴权注解 / 配置重启服务自动同步规则网关无需重启。3. Gateway 监听配置中心加载全量鉴权规则Gateway 监听gateway-auth-routes配置变更配置更新自动刷新内存路由鉴权表内存维护一个匹配器列表支持 Ant 路径匹配/xxx/**。4. Gateway 全局过滤器统一鉴权执行控制权在网关自定义GlobalFilter执行流程过滤器执行顺序获取当前请求路径request.getPath()内存匹配器查找该路径对应的鉴权规则分支判断规则needLoginfalse直接转发下游服务不执行鉴权规则needLogintrue网关执行全套鉴权逻辑提取 Header token校验 token 是否存在、过期、非法解析 token 拿到用户 ID、角色、权限集合对比接口要求的 permissions/roles不匹配直接返回 401/403鉴权通过把用户信息放入请求头转发给业务服务业务服务完全不处理 token、登录校验只从 Header 拿已认证用户信息。核心代码简化示例javaOverride public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path exchange.getRequest().getPath().value(); // 1. 查询应用定义的鉴权规则 AuthRule rule authRuleMatcher.match(path); if (!rule.isNeedLogin()) { // 免登接口直接放行 return chain.filter(exchange); } // 2. 网关统一鉴权逻辑 String token exchange.getRequest().getHeaders().getFirst(Authorization); if (StrUtil.isBlank(token)) { return response401(exchange); } UserAuthInfo user tokenParser.verifyToken(token); if (user null) { return response401(exchange); } // 3. 校验权限角色 if (!user.hasPermission(rule.getPermissions()) || !user.hasRole(rule.getRoles())) { return response403(exchange); } // 4. 透传用户信息给下游服务 ServerHttpRequest newReq exchange.getRequest().mutate() .header(X-User-Id, user.getUserId().toString()) .header(X-User-Roles, StrUtil.join(,, user.getRoles())) .build(); return chain.filter(exchange.mutate().request(newReq).build()); }三、补充优化方案可选方案 1不依赖配置中心服务主动注册元数据到网关缓存各微服务启动后调用网关提供的/auth/register接口上报自身鉴权规则Gateway 本地缓存规则定时心跳同步 适合无 Nacos/Apollo 的简单架构缺点是服务下线要手动清理缓存。方案 2网关动态路由 内置鉴权 PredicateGateway 原生特性利用 Gateway 路由断言自定义AuthPredicate业务服务的路由配置中携带鉴权标识路由规则存在 Nacosspring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path/user/login/** - AuthNeedLoginfalse # 业务定义免登 - id: user-service-auth uri: lb://user-service predicates: - Path/user/update/** - AuthNeedLogintrue,permsuser:edit网关自定义 Predicate 解析 Auth 标识全局过滤器读取断言参数执行鉴权。 优点复用 Gateway 原生路由配置无需额外存储一套规则缺点鉴权规则和路由耦合业务不方便单独管理接口权限。四、架构权责总结应用侧管控资源范围 每个服务通过注解 /yml 自主标记哪些接口需要登录、需要什么权限新增 / 修改接口只改自身代码配置网关侧独占鉴权控制权 token 校验、过期判断、权限比对、统一错误返回全部在网关下游服务无任何鉴权代码配置中心作为中间枢纽 统一汇聚所有服务的鉴权范围配置网关动态感知变更无需重启网关生效解耦收益新增微服务不用改网关代码服务自身定义鉴权规则即可鉴权逻辑统一收口安全策略token 加密、黑名单、登录超时只维护网关一处业务只关心自身接口权限不用关心底层鉴权实现。五、扩展边界场景全局免登白名单健康检查 / 文档网关内置固定白名单优先级高于应用配置灰度鉴权、临时关闭鉴权网关统一开关控制不影响业务配置多租户、接口分级权限应用配置只定义需求网关统一执行租户隔离校验。