SpringCloud Gateway 权限认证的实现

 更新时间:2025年04月16日 12:03:06   作者:一个差不多的先生  
Spring Cloud Gateway 作为网关层,承担着请求转发、权限校验等重要职责,本文主要介绍了SpringCloud Gateway 权限认证的实现,具有一定的参考价值,感兴趣的可以了解一下

在微服务架构中,Spring Cloud Gateway 作为网关层,承担着请求转发、权限校验等重要职责。通过集成 Spring Security 和 JWT(JSON Web Token),可以在网关层实现集中式的权限认证,确保系统的安全性和数据保护。以下是详细的实现步骤:

一、添加依赖

在 Spring Boot 项目中,添加 Spring Cloud Gateway、Spring Security 和 JWT 相关依赖。以下是 pom.xml 的配置示例:

<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <!-- Spring Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <!-- JWT Support -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.11.5</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-impl</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-jackson</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

二、配置 Spring Security

在 Spring Cloud Gateway 中,使用 Spring Security 的 WebFlux 模块来实现权限校验。以下是一个典型的配置类:

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http, JwtAuthenticationManager jwtAuthenticationManager) {
        http
            .csrf().disable() // 禁用 CSRF 保护
            .authorizeExchange(exchanges -> exchanges
                .pathMatchers("/login", "/register").permitAll() // 公开登录和注册接口
                .anyExchange().authenticated()) // 其他请求需要认证
            .addFilterAt(jwtAuthenticationFilter(jwtAuthenticationManager), SecurityWebFilterChain.class);

        return http.build();
    }

    private AuthenticationWebFilter jwtAuthenticationFilter(JwtAuthenticationManager jwtAuthenticationManager) {
        AuthenticationWebFilter filter = new AuthenticationWebFilter(jwtAuthenticationManager);
        filter.setServerAuthenticationConverter(new BearerTokenServerAuthenticationConverter());
        return filter;
    }
}

三、实现 JWT 工具类

JWT 工具类用于生成和解析 JWT 令牌。以下是工具类的实现:

@Component
public class JwtUtil {
    private String secret = "yourSecretKey"; // 密钥应存储在安全的地方,避免硬编码

    public Mono<String> extractUsername(String token) {
        return Mono.just(extractClaim(token, Claims::getSubject));
    }

    public Date extractExpiration(String token) {
        return extractClaim(token, Claims::getExpiration);
    }

    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = extractAllClaims(token);
        return claimsResolver.apply(claims);
    }

    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    public Mono<String> generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        return Mono.just(createToken(claims, userDetails.getUsername()));
    }

    private String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10小时过期
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }

    public Mono<Boolean> validateToken(String token, UserDetails userDetails) {
        final String username = extractUsername(token).block();
        return Mono.just(username.equals(userDetails.getUsername()) && !isTokenExpired(token));
    }

    private Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }
}

四、实现 JWT 认证管理器

JWT 认证管理器用于处理 JWT 的验证逻辑:

@Component
public class JwtAuthenticationManager implements ReactiveAuthenticationManager {
    private final JwtUtil jwtUtil;
    private final UserDetailsService userDetailsService;

    public JwtAuthenticationManager(JwtUtil jwtUtil, UserDetailsService userDetailsService) {
        this.jwtUtil = jwtUtil;
        this.userDetailsService = userDetailsService;
    }

    @Override
    public Mono<Authentication> authenticate(Authentication authentication) {
        String token = (String) authentication.getCredentials();
        return jwtUtil.extractUsername(token)
                .flatMap(username -> {
                    if (jwtUtil.validateToken(token, userDetailsService.loadUserByUsername(username)).block()) {
                        UserDetails userDetails = userDetailsService.loadUserByUsername(username);
                        return Mono.just(new UsernamePasswordAuthenticationToken(userDetails, token, userDetails.getAuthorities()));
                    } else {
                        return Mono.empty();
                    }
                });
    }
}

五、实现 Bearer Token 转换器

Bearer Token 转换器用于从请求头中提取 JWT 令牌:

public class BearerTokenServerAuthenticationConverter implements ServerAuthenticationConverter {
    @Override
    public Mono<Authentication> convert(ServerWebExchange exchange) {
        String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            String token = authHeader.substring(7);
            return Mono.just(new BearerTokenAuthentication(token));
        }
        return Mono.empty();
    }
}

六、配置 Gateway 路由

在 application.yml 文件中配置路由规则:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/users/**
          filters:
            - JwtAuthenticationFilter

七、总结

到此这篇关于SpringCloud Gateway 权限认证的实现的文章就介绍到这了,更多相关SpringCloud Gateway 权限认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java对接拉卡拉支付完整指南(附详细代码)

    Java对接拉卡拉支付完整指南(附详细代码)

    拉卡拉支付SDK是一个面向Java开发者的支付解决方案,其设计目的是为了帮助开发者在Java环境中轻松集成拉卡拉的支付功能,这篇文章主要介绍了Java对接拉卡拉支付的相关资料,需要的朋友可以参考下
    2026-03-03
  • Spring @Around注解使用及说明

    Spring @Around注解使用及说明

    @Around是SpringAOP中的一个注解,用于定义环绕通知,可以在方法执行前后执行自定义逻辑,并控制方法的执行或修改返回值, SpringAOP通过代理对象实现环绕通知,匹配切入点,创建代理并执行环绕通知,@Around注解的应用场景广泛
    2025-12-12
  • Java利用Jackson轻松处理JSON序列化与反序列化

    Java利用Jackson轻松处理JSON序列化与反序列化

    Jackson 是 Java 中最流行的 JSON 处理库之一,它提供了许多注解来简化 JSON 的序列化和反序列化过程。这篇文章将介绍一些 Jackson 常用的注解,以帮助您更轻松地处理 JSON 数据
    2023-05-05
  • 一文深入理解Java中的深拷贝机制

    一文深入理解Java中的深拷贝机制

    在Java编程中,我们经常需要处理对象的复制问题,深拷贝和浅拷贝是两种常见的复制方式,它们在内存管理和对象引用方面存在不同特点,本文将带大家深入探究Java中的深拷贝机制,需要的朋友可以参考下
    2023-09-09
  • 利用Spring Boot操作MongoDB的方法教程

    利用Spring Boot操作MongoDB的方法教程

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多,下面这篇文章主要给大家介绍了利用Spring Boot操作MongoDB的方法教程,需要的朋友可以参考下
    2017-05-05
  • Java中s.charAt(index)用于提取字符串s中的特定字符操作

    Java中s.charAt(index)用于提取字符串s中的特定字符操作

    这篇文章主要介绍了Java中s.charAt(index)用于提取字符串s中的特定字符操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Spring创建bean的几种方式及使用场景

    Spring创建bean的几种方式及使用场景

    本文主要介绍了Spring创建bean的几种方式及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 基于Java开发一个极简版敏感词检测工具

    基于Java开发一个极简版敏感词检测工具

    这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-08-08
  • java实现AES 32位加密解密的方案

    java实现AES 32位加密解密的方案

    Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),我们只需要将其部署在JRE环境中,就可以解决限制问题,下面给大家介绍下java实现AES 32位加密解密的方案,感兴趣的朋友一起看看吧
    2021-11-11
  • Java工程的Resources目录从基础到高级应用深入探索

    Java工程的Resources目录从基础到高级应用深入探索

    这篇文章主要介绍了Java工程中的resources目录,从基础概念到高级应用,涵盖了如何创建、使用以及资源文件的加载方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01

最新评论