欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud Gateway 權限認證的實現(xiàn)

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

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

一、添加依賴

在 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 模塊來實現(xiàn)權限校驗。以下是一個典型的配置類:

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

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

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

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

四、實現(xiàn) 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();
                    }
                });
    }
}

五、實現(xiàn) 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 文件中配置路由規(guī)則:

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

七、總結

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

相關文章

  • java-thymeleaf的使用方式

    java-thymeleaf的使用方式

    這篇文章主要介紹了java-thymeleaf的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java 設計模式(DAO)的實例詳解

    java 設計模式(DAO)的實例詳解

    這篇文章主要介紹了java 設計模式(DAO)的實例詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 詳解Java設計模式中的裝飾模式

    詳解Java設計模式中的裝飾模式

    裝飾模式是指在不改變現(xiàn)有對象結構的情況下,動態(tài)地給該對象增加一些職責(即增加其額外功能)的模式,它屬于對象結構型模式。本文將為大家詳細介紹一下裝飾模式,感興趣的可以了解一下
    2021-12-12
  • java基礎--自己動手實現(xiàn)一個LRU

    java基礎--自己動手實現(xiàn)一個LRU

    這篇文章主要介紹了運用方案如何實現(xiàn)LUR,文章中通過代碼講解的非常詳細,對大家的工作或學習有一定的參考價值,感興趣的朋友可以參考一下
    2021-08-08
  • String.trim()消除不了空格的問題及解決

    String.trim()消除不了空格的問題及解決

    這篇文章主要介紹了String.trim()消除不了空格的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • idea2023遠程調試springboot的過程詳解

    idea2023遠程調試springboot的過程詳解

    這篇文章主要介紹了idea2023遠程調試,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 淺析關于java的序列化和反序列化

    淺析關于java的序列化和反序列化

    這篇文章主要介紹了淺析關于java的序列化和反序列化,所謂序列化,就是把要傳輸?shù)膶ο笠约跋嚓P信息轉換成字節(jié)數(shù)組進行存儲的過程,而反序列化就是將字節(jié)數(shù)組再轉回對象的過程,需要的朋友可以參考下
    2023-07-07
  • Java生成10個1000以內的隨機數(shù)并用消息框顯示數(shù)組內容然后求和輸出

    Java生成10個1000以內的隨機數(shù)并用消息框顯示數(shù)組內容然后求和輸出

    這篇文章主要介紹了Java生成10個1000以內的隨機數(shù)并用消息框顯示數(shù)組內容然后求和輸出,需要的朋友可以參考下
    2015-10-10
  • java.lang.ClassCastException的問題解決

    java.lang.ClassCastException的問題解決

    本文主要介紹了java.lang.ClassCastException的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • java dump文件怎么生成和分析-JMAP用法詳解

    java dump文件怎么生成和分析-JMAP用法詳解

    這篇文章主要介紹了java dump文件怎么生成和分析-JMAP用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論