【重点】springcloud分布式中gateway+shiro+jwt认证流程(思路)
Spring Cloud Gateway 结合 Shiro 和 JWT 实现分布式系统的认证和授权,大致步骤如下:
- 用户发送登录请求,后端验证用户凭据,生成JWT Token。
- 用户每次请求携带JWT Token,Gateway过滤器检查Token的合法性。
- 如果Token有效,请求被转发到对应服务;如果无效或缺失,返回错误信息。
具体实现:
- 配置Gateway路由和过滤器,使其能够识别和处理JWT Token。
- 使用Shiro进行权限控制,结合JWT生成的Token进行用户认证和授权。
- 创建自定义的GlobalFilter,在其中进行JWT Token的验证。
以下是核心代码示例:
Gateway配置 (application.yml
):
spring:
cloud:
gateway:
routes:
- id: service-id
uri: http://service-uri
predicates:
- Path=/service/**
filters:
- TokenValidationFilter
自定义过滤器:
@Component
@Slf4j
public class TokenValidationFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || token.isEmpty()) {
log.error("Token is missing");
// 返回未授权的响应
return exchange.getResponse().setComplete();
}
try {
// 使用JWT进行Token验证
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token.replace("Bearer ", ""))
.getBody();
// 验证通过,继续执行
return chain.filter(exchange);
} catch (Exception e) {
log.error("Invalid token: {}", e.getMessage());
// 返回未授权的响应
return exchange.getResponse().setComplete();
}
}
@Override
public int getOrder() {
// 确保此过滤器在认证过滤器之前
return -1;
}
}
Shiro配置:
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
definition.addPathDefinition("/login", "anon");
definition.addPathDefinition("/**", "authc");
return definition;
}
@Bean
public Realm realm() {
// 实现自定义的Realm,用于从Token中获取用户信息
return new MyRealm();
}
自定义Realm:
public class MyRealm extends AuthorizingRealm {
// 授权逻辑
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 实现根据Token获取用户角色和权限
}
// 认证逻辑
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) thr
评论已关闭