Spring Cloud Gateway 实现登录校验:构建统一认证入口

Spring Cloud Gateway 实现登录校验:构建统一认证入口

一、为什么需要在网关层进行登录校验?

🔒 遇到的实际问题:

  • 用户请求直接打到某个微服务,绕过了登录认证;
  • 每个服务都实现登录校验,代码冗余、安全隐患大;
  • 缺乏统一认证体系,权限边界模糊;
  • 无法集中管理黑名单、权限控制等安全规则。

✅ 网关统一登录校验的优势:

优点 说明
安全性高 所有请求必须经过网关,避免绕过
易于维护 登录校验逻辑集中处理
可扩展性强 支持多种认证方式,如 JWT、Session、OAuth2
支持 Token 鉴权 JWT 无状态、跨服务使用
降低服务耦合度 各服务只关注业务逻辑,不再处理认证

二、实战演示:Gateway + JWT 登录拦截实现

🔐 推荐方案:JWT(JSON Web Token)

  • 前端登录成功后,认证服务返回 JWT Token;
  • Token 存储在前端本地(localStorage / cookie);
  • 所有请求都在 Header 中携带 Token;
  • 网关拦截并解析 Token,验证其合法性;
  • 若合法则放行请求,否则返回 401 未授权。

1️⃣ 引入依赖

xml 复制代码
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2️⃣ JWT 工具类

java 复制代码
public class JwtUtil {
    private static final String SECRET = "MySecretKey";

    public static Claims parseToken(String token) throws Exception {
        return Jwts.parser()
            .setSigningKey(SECRET.getBytes(StandardCharsets.UTF_8))
            .parseClaimsJws(token)
            .getBody();
    }

    public static boolean isExpired(Claims claims) {
        return claims.getExpiration().before(new Date());
    }
}

3️⃣ 编写网关登录过滤器(GlobalFilter)

java 复制代码
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    private static final List<String> whiteList = Arrays.asList(
        "/login", "/register", "/actuator/**"
    );

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String path = exchange.getRequest().getURI().getPath();

        // 白名单放行
        if (whiteList.stream().anyMatch(path::startsWith)) {
            return chain.filter(exchange);
        }

        // 获取 Authorization 头
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (StringUtils.hasText(token) && token.startsWith("Bearer ")) {
            token = token.replace("Bearer ", "");
            try {
                Claims claims = JwtUtil.parseToken(token);
                if (!JwtUtil.isExpired(claims)) {
                    // Token 有效,放行
                    return chain.filter(exchange);
                }
            } catch (Exception e) {
                // Token 非法或异常
            }
        }

        // 拦截并返回 401
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -100; // 优先级高
    }
}

4️⃣ 配置白名单和跨域支持(可选)

java 复制代码
@Configuration
public class CorsGlobalConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

三、常见问题与处理建议

问题 解决方案
前端跨域无法访问 Gateway 接口 配置 CORS
Token 解析失败或过期 返回 401 并提示重新登录
微服务之间需要用户信息 可通过请求头传递用户ID、角色等信息
白名单路径过多 可集中配置在 application.yml 或配置中心
相关推荐
欢醉2 天前
踩坑记:一次Nacos客户端偶发connect timed out全链路排查
nacos·springcloud
小小谈电商3 天前
大型集团级 B2B2C 商城落地|微服务高并发电商系统实践复盘
springcloud·商城源码选型·微服务电商·b2b2c商城·集团电商
jonyleek5 天前
企业文档私有化实践:基于JVS数字底座的可控协同架构设计与落地要点
elasticsearch·私有化部署·springcloud·微服务架构·信创适配·jvs·企业文档
滕州市燕猫虎计算机科技工作室个体工商户7 天前
SpringCloud应用启动后自动shutdown的原因
springboot·springcloud·自动退出·自动shutdown
爱看老照片7 天前
Spring Cloud 微服务安全防护策略实现指南
微服务·springcloud·security·防护性策略实现·防护性技术选型
jonyleek7 天前
企业级自动化实践:为什么确定性业务逻辑需要可视化能力编排而非AI生成代码
springcloud·低代码平台·流程引擎·java开发·企业自动化·逻辑编排·合规开发
欢醉9 天前
一次RabbitMQ重启引发的网关雪崩复盘
springcloud·架构设计
欢醉16 天前
生产复盘:请求报413 Request Entity Too Large问题分享
springboot·springcloud
苏生Susheng20 天前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
jonyleek1 个月前
技术实践:基于 Vue3 + Spring Cloud 微服务实现私有化文档系统的类 SaaS 协同体验
微服务·私有化部署·vue3·springcloud·协同编辑·jvs企业文档·无忧企业文档