Spring Boot 、Spring Cloud 微服务架构认证授权方案
目录前言方案一JWT Spring Security最常用1.登录2.请求3.Gateway统一校验4.Gateway过滤器5.微服务是否还要校验做法1做法2推荐6.Token过期怎么办7.Access Token Refresh TokenAccess TokenRefresh Token方案二OAuth2 标准方案方案三国内项目常用Sa-Token方案四证券行业推荐架构前言Spring Boot 或者 Spring Cloud 微服务架构中最常见的认证授权场景。需求场景用户登录后颁发 Token所有微服务校验 TokenToken 过期自动续签微服务之间调用传递用户身份目前主流方案有方案推荐度适用场景JWT Spring Security★★★★★最常见OAuth2 Spring Authorization Server★★★★★企业级标准方案Sa-Token★★★★★国内项目非常流行Apache Shiro★★老项目较多Session共享Redis★★单体项目较多对于 Spring Cloud 项目现在最主流的是Spring Security JWT Gateway或者Spring Authorization Server OAuth2 JWT方案一JWT Spring Security最常用架构登录 ------------- | auth-service | ------------- | | 生成JWT ▼ eyJhbGciOiJIUzI1NiJ9... | ▼ 浏览器/APP保存Token | ▼ Gateway | ▼ user-service order-service1.登录用户登录POST /login { username:admin, password:123456 }认证成功{token:xxxxx.yyyyy.zzzzz}JWT内容{userId:1001,username:admin,role:ADMIN,exp:1750000000}2.请求GET /user/info Authorization: Bearer xxxxx.yyyyy.zzzzz3.Gateway统一校验不要每个微服务都校验。一般放在 Gateway。用户 ↓ Gateway ↓ UserService ↓ OrderService流程请求 ↓ Gateway ↓ 解析JWT ↓ 验证签名 ↓ 验证过期时间 ↓ 放行失败{code:401,msg:token已失效}4.Gateway过滤器例如ComponentpublicclassJwtFilterimplementsGlobalFilter{OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){Stringtokenexchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);if(tokennull){thrownewRuntimeException(未登录);}JwtUtil.parse(token);returnchain.filter(exchange);}}这样所有微服务自动生效。5.微服务是否还要校验有两种做法。做法1只在Gateway校验用户 ↓ Gateway ↓ UserService优点性能高缺点绕过Gateway直接访问服务有风险做法2推荐Gateway校验一次微服务再校验一次用户 ↓ Gateway ↓ UserService ↓ 再次校验JWT银行、证券、支付系统通常这样做。你在证券行业建议采用这种模式。6.Token过期怎么办JWT天然有过期时间Jwts.builder().setExpiration(newDate(System.currentTimeMillis()3600_000))例如1小时过期问题来了用户操作到59分钟时突然过期体验很差。所以需要Access Token Refresh Token7.Access Token Refresh Token登录{accessToken:xxx,refreshToken:yyy}Access Token有效期30分钟Refresh Token有效期7天流程用户请求 ↓ Access Token过期 ↓ 401 ↓ 前端调用 /auth/refresh ↓ 携带Refresh Token ↓ 认证中心 ↓ 签发新的Access Token用户无感知。方案二OAuth2 标准方案大厂一般Authorization Server Resource ServerSpring 官方方案Spring SecuritySpring Authorization Server架构------------------ | Authorization | | Server | ------------------ | 签发JWT | --------- --------- | UserSvc | |OrderSvc | --------- ---------认证中心负责登录 签发Token 刷新Token 注销Token业务系统负责校验Token 读取用户信息职责非常清晰。方案三国内项目常用Sa-Token如果你不想写一堆 Spring Security 配置。推荐Sa-Token 官方网站特点比Spring Security简单 支持JWT 支持Redis 支持单点登录 支持权限控制 支持踢人下线 支持Token续签登录StpUtil.login(userId);获取TokenStringtokenStpUtil.getTokenValue();校验StpUtil.checkLogin();非常简单。很多国内中后台项目都在使用。方案四证券行业推荐架构如果目前的技术栈是Spring Boot Spring CloudGateway │ ▼ auth-service │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ user-service order-service trade-service │ ▼ Redis认证方案Spring Security JWT Redis GatewayToken设计Access Token 30分钟 Refresh Token 7天流程登录 ↓ auth-service签发Token ↓ Gateway校验 ↓ 微服务二次校验 ↓ 过期 ↓ Refresh Token换新Token这是目前绝大多数金融、证券、银行类 Spring Cloud 系统采用的模式。其他建议深入理解的Spring Security 认证流程JWT 的组成与签名原理OAuth2 四种授权模式Spring Authorization ServerGateway 统一鉴权Refresh Token 续签机制单点登录SSORedis 黑名单 Token用户强制下线实现原理