最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud Gateway 權(quán)限認(rèn)證的實(shí)現(xiàn)

 更新時(shí)間:2025年04月16日 12:03:06   作者:一個(gè)差不多的先生  
Spring Cloud Gateway 作為網(wǎng)關(guān)層,承擔(dān)著請(qǐng)求轉(zhuǎn)發(fā)、權(quán)限校驗(yàn)等重要職責(zé),本文主要介紹了SpringCloud Gateway 權(quán)限認(rèn)證的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

在微服務(wù)架構(gòu)中,Spring Cloud Gateway 作為網(wǎng)關(guān)層,承擔(dān)著請(qǐng)求轉(zhuǎn)發(fā)、權(quán)限校驗(yàn)等重要職責(zé)。通過(guò)集成 Spring Security 和 JWT(JSON Web Token),可以在網(wǎng)關(guān)層實(shí)現(xiàn)集中式的權(quán)限認(rèn)證,確保系統(tǒng)的安全性和數(shù)據(jù)保護(hù)。以下是詳細(xì)的實(shí)現(xiàn)步驟:

一、添加依賴

在 Spring Boot 項(xiàng)目中,添加 Spring Cloud Gateway、Spring Security 和 JWT 相關(guān)依賴。以下是 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 模塊來(lái)實(shí)現(xiàn)權(quán)限校驗(yàn)。以下是一個(gè)典型的配置類:

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http, JwtAuthenticationManager jwtAuthenticationManager) {
        http
            .csrf().disable() // 禁用 CSRF 保護(hù)
            .authorizeExchange(exchanges -> exchanges
                .pathMatchers("/login", "/register").permitAll() // 公開(kāi)登錄和注冊(cè)接口
                .anyExchange().authenticated()) // 其他請(qǐng)求需要認(rèn)證
            .addFilterAt(jwtAuthenticationFilter(jwtAuthenticationManager), SecurityWebFilterChain.class);

        return http.build();
    }

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

三、實(shí)現(xiàn) JWT 工具類

JWT 工具類用于生成和解析 JWT 令牌。以下是工具類的實(shí)現(xiàn):

@Component
public class JwtUtil {
    private String secret = "yourSecretKey"; // 密鑰應(yīng)存儲(chǔ)在安全的地方,避免硬編碼

    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小時(shí)過(guò)期
                .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());
    }
}

四、實(shí)現(xiàn) JWT 認(rèn)證管理器

JWT 認(rèn)證管理器用于處理 JWT 的驗(yàn)證邏輯:

@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();
                    }
                });
    }
}

五、實(shí)現(xiàn) Bearer Token 轉(zhuǎn)換器

Bearer Token 轉(zhuǎn)換器用于從請(qǐng)求頭中提取 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 文件中配置路由規(guī)則:

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

七、總結(jié)

到此這篇關(guān)于SpringCloud Gateway 權(quán)限認(rèn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringCloud Gateway 權(quán)限認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java對(duì)接拉卡拉支付完整指南(附詳細(xì)代碼)

    Java對(duì)接拉卡拉支付完整指南(附詳細(xì)代碼)

    拉卡拉支付SDK是一個(gè)面向Java開(kāi)發(fā)者的支付解決方案,其設(shè)計(jì)目的是為了幫助開(kāi)發(fā)者在Java環(huán)境中輕松集成拉卡拉的支付功能,這篇文章主要介紹了Java對(duì)接拉卡拉支付的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • Spring @Around注解使用及說(shuō)明

    Spring @Around注解使用及說(shuō)明

    @Around是SpringAOP中的一個(gè)注解,用于定義環(huán)繞通知,可以在方法執(zhí)行前后執(zhí)行自定義邏輯,并控制方法的執(zhí)行或修改返回值, SpringAOP通過(guò)代理對(duì)象實(shí)現(xiàn)環(huán)繞通知,匹配切入點(diǎn),創(chuàng)建代理并執(zhí)行環(huán)繞通知,@Around注解的應(yīng)用場(chǎng)景廣泛
    2025-12-12
  • Java利用Jackson輕松處理JSON序列化與反序列化

    Java利用Jackson輕松處理JSON序列化與反序列化

    Jackson?是?Java?中最流行的?JSON?處理庫(kù)之一,它提供了許多注解來(lái)簡(jiǎn)化?JSON?的序列化和反序列化過(guò)程。這篇文章將介紹一些?Jackson?常用的注解,以幫助您更輕松地處理?JSON?數(shù)據(jù)
    2023-05-05
  • 一文深入理解Java中的深拷貝機(jī)制

    一文深入理解Java中的深拷貝機(jī)制

    在Java編程中,我們經(jīng)常需要處理對(duì)象的復(fù)制問(wèn)題,深拷貝和淺拷貝是兩種常見(jiàn)的復(fù)制方式,它們?cè)趦?nèi)存管理和對(duì)象引用方面存在不同特點(diǎn),本文將帶大家深入探究Java中的深拷貝機(jī)制,需要的朋友可以參考下
    2023-09-09
  • 利用Spring Boot操作MongoDB的方法教程

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

    mongodb是最早熱門非關(guān)系數(shù)據(jù)庫(kù)的之一,使用也比較普遍,一般會(huì)用做離線數(shù)據(jù)分析來(lái)使用,放到內(nèi)網(wǎng)的居多,下面這篇文章主要給大家介紹了利用Spring Boot操作MongoDB的方法教程,需要的朋友可以參考下
    2017-05-05
  • Java中s.charAt(index)用于提取字符串s中的特定字符操作

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

    這篇文章主要介紹了Java中s.charAt(index)用于提取字符串s中的特定字符操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景

    Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景

    本文主要介紹了Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 基于Java開(kāi)發(fā)一個(gè)極簡(jiǎn)版敏感詞檢測(cè)工具

    基于Java開(kāi)發(fā)一個(gè)極簡(jiǎn)版敏感詞檢測(cè)工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Java開(kāi)發(fā)一個(gè)極簡(jiǎn)版敏感詞檢測(cè)工具,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-08-08
  • java實(shí)現(xiàn)AES 32位加密解密的方案

    java實(shí)現(xiàn)AES 32位加密解密的方案

    Oracle在其官方網(wǎng)站上提供了無(wú)政策限制權(quán)限文件(Unlimited Strength Jurisdiction Policy Files),我們只需要將其部署在JRE環(huán)境中,就可以解決限制問(wèn)題,下面給大家介紹下java實(shí)現(xiàn)AES 32位加密解密的方案,感興趣的朋友一起看看吧
    2021-11-11
  • Java工程的Resources目錄從基礎(chǔ)到高級(jí)應(yīng)用深入探索

    Java工程的Resources目錄從基礎(chǔ)到高級(jí)應(yīng)用深入探索

    這篇文章主要介紹了Java工程中的resources目錄,從基礎(chǔ)概念到高級(jí)應(yīng)用,涵蓋了如何創(chuàng)建、使用以及資源文件的加載方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01

最新評(píng)論

泽州县| 玉树县| 商丘市| 甘泉县| 巴南区| 广饶县| 克东县| 名山县| 梨树县| 万盛区| 会东县| 斗六市| 乐业县| 沐川县| 甘谷县| 永登县| 大同市| 迁西县| 闵行区| 德惠市| 建昌县| 岢岚县| 吴旗县| 鹤峰县| 民县| 旌德县| 于都县| 赣榆县| 平南县| 珠海市| 顺义区| 宜都市| 清原| 株洲县| 乐业县| 筠连县| 藁城市| 万州区| 昌江| 古田县| 彭山县|