需求背景
在微服务的场景下,采用了Spring Cloud Oauth2进行token的管理,实现认证和授权,在这下背景下,有两种解决方案:
网关统一鉴权
此模式适用于网关下的所有模式都是通过一种模式进行鉴权操作,可以统一管理
微服务模块各自鉴权
此模式适用于网关下的各个模块有不同的鉴权模式,针对不同的业务场景需要满足不同的实现,如采用oauth2、shiro、签名等方式。
下文就网关统一鉴权的实现方式提供解决方案,以供参考
实现方案
通过过滤器的方式实现统一拦截,下面以核心代码的方式展示,具体所有代码可以参考Matecloud项目。
过滤器代码
package vip.mate.gateway.filter;
import io.jsonwebtoken.Claims;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import vip.mate.core.cloud.props.MateUaaProperties;
import vip.mate.core.common.constant.MateConstant;
import vip.mate.core.common.constant.Oauth2Constant;
import vip.mate.core.common.util.ResponseUtil;
import vip.mate.core.common.util.SecurityUtil;
/**