SpringCloud Gateway 權(quán)限認(rèn)證的實(shí)現(xiàn)
在微服務(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ì)代碼)
拉卡拉支付SDK是一個(gè)面向Java開(kāi)發(fā)者的支付解決方案,其設(shè)計(jì)目的是為了幫助開(kāi)發(fā)者在Java環(huán)境中輕松集成拉卡拉的支付功能,這篇文章主要介紹了Java對(duì)接拉卡拉支付的相關(guān)資料,需要的朋友可以參考下2026-03-03
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)景,文中通過(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è)工具
這篇文章主要為大家詳細(xì)介紹了如何基于Java開(kāi)發(fā)一個(gè)極簡(jiǎn)版敏感詞檢測(cè)工具,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-08-08
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)用,涵蓋了如何創(chuàng)建、使用以及資源文件的加載方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01

