Spring Cloud Gateway 使用JWT工具类做用户登录校验功能
本攻略将详细讲解如何使用Spring Cloud Gateway和JWT工具类实现用户登录校验功能,包括概念、原理、示例说明等内容。
JWT的概念
JWT(JSON Web Token)是一种基于JSON格式的轻量级身份认证和授权机制,它可以在用户和服务器之间传递安全可靠的信息。JWT由三部分组成:头部、载荷和签名。
- 头部:包含了加密算法和类型等信息;
- 载荷:包含了用户信息和其他相关信息;
- 签名:用于验证JWT的真实性和完整性。
Spring Cloud Gateway使用JWT的原理
Spring Cloud Gateway使用JWT的原理是通过以下几个步骤来实现的:
- 用户登录
用户在登录时,将用户名和密码发送到后台进行验证,如果验证通过,则生成JWT并返回给客户端。
- 客户端请求
客户端在请求时,将JWT放入请求头中,例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- 网关校验
Spring Cloud Gateway在接收到请求时,会从请求头中获取JWT,并使用JWT工具类进行校验,如果校验通过,则将请求转发到目标服务。
示例说明
以下是两个示例说明,演示了如何使用Spring Cloud Gateway和JWT工具类实现用户登录校验功能。
示例1:使用Spring Cloud Gateway和JWT工具类实现用户登录校验
使用Spring Cloud Gateway和JWT工具类实现用户登录校验,包括添加依赖、配置JWT工具类、配置路由规则等步骤。
- 添加依赖
在Spring Boot项目中添加Spring Cloud Gateway和JWT相关依赖,例如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 配置JWT工具类
在Spring Boot项目中配置JWT工具类,例如:
@Component
public class JwtUtil {
private static final String SECRET_KEY = "mySecretKey";
private static final long EXPIRATION_TIME = 864_000_000L;
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
return claims.getSubject();
}
}
以上代码实现了一个JwtUtil类,用于生成、校验和解析JWT。
- 配置路由规则
在Spring Boot项目中配置路由规则,例如:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/users/**
filters:
- name: JwtAuthFilter
args:
jwtUtil: "#{@jwtUtil}"
以上配置定义了一个名为user-service的路由规则,将访问路径为/users/**的请求转发到user-service服务,并使用JwtAuthFilter过滤器进行校验。
- 实现过滤器
在Spring Boot项目中实现JwtAuthFilter过滤器,例如:
public class JwtAuthFilter implements GatewayFilter, Ordered {
private static final String AUTHORIZATION_HEADER = "Authorization";
private static final String BEARER_PREFIX = "Bearer ";
private JwtUtil jwtUtil;
public JwtAuthFilter(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst(AUTHORIZATION_HEADER);
if (token != null && token.startsWith(BEARER_PREFIX)) {
token = token.substring(BEARER_PREFIX.length());
if (jwtUtil.validateToken(token)) {
String username = jwtUtil.getUsernameFromToken(token);
ServerHttpRequest request = exchange.getRequest().mutate()
.header("X-User-Name", username)
.build();
return chain.filter(exchange.mutate().request(request).build());
}
}
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1;
}
}
以上代码实现了一个JwtAuthFilter过滤器,用于校验JWT并将用户信息添加到请求头中。
示例2:使用Spring Cloud Gateway和JWT工具类实现用户登录
使用Spring Cloud Gateway和JWT工具类实现用户登录,包括添加依赖、配置JWT工具类、实现登录接口等步骤。
- 添加依赖
在Spring Boot项目中添加Spring Cloud Gateway和JWT相关依赖,例如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 配置JWT工具类
在Spring Boot项目中配置JWT工具类,例如:
@Component
public class JwtUtil {
private static final String SECRET_KEY = "mySecretKey";
private static final long EXPIRATION_TIME = 864_000_000L;
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
return claims.getSubject();
}
}
以上代码实现了一个JwtUtil类,用于生成、校验和解析JWT。
- 实现登录接口
在Spring Boot项目中实现登录接口,例如:
@RestController
public class LoginController {
@Autowired
private JwtUtil jwtUtil;
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
if ("admin".equals(username) && "123456".equals(password)) {
return jwtUtil.generateToken(username);
} else {
throw new RuntimeException("用户名或密码错误");
}
}
}
以上代码实现了一个LoginController类,用于处理用户登录请求并返回JWT。
总结
Spring Cloud Gateway和JWT工具类可以很好地结合使用,实现用户登录校验功能。在实际应用中,我们可以根据具体情况适合自己的网关方案,提高系统的可用性和稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Cloud Gateway 使用JWT工具类做用户登录校验功能 - Python技术站