权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽
一、SpringCloud GateWay
1.它是如何工作的?
客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配,它将被发送到Gateway Web处理程序。这个处理程序通过一个特定于该请求的过滤器链来运行该请求。过滤器被虚线分割的原因是,过滤器可以在代理请求发送之前和之后运行逻辑。所有的 "pre"
(前)过滤器逻辑都被执行。然后发出代理请求。在代理请求发出后,"post"
(后)过滤器逻辑被运行
2.SpringCloudGateway主要有什么用?
- 路由转发:这是网关最主要的功能,通过配置统一将请求转发至相应的服务,否则客户端需多次请求不同的微服务,增加客户端代码或配置编写的复杂性,目前官网给出的配置条件有:After(某个时间后的请求转发至该服务)、Before(某个时间前的请求转发至该服务)、Between(某个时间范围的请求转发至该服务)、Cookie(匹配到对应的Cookie值)、Header(匹配到对应的Header值)、Host(匹配到对应的域名)、Method(匹配到对应的get/post请求)、Path(匹配到对应的url)、Query(匹配到对应的参数)、RemoteAddr(匹配到对应的RemoteAddr)、Weight(设定分流的权重)原文链接:
- 熔断:可以通过配置FallbackHeaders GatewayFilter Factory进行熔断
- 限流:可以通过配置RequestRateLimiter GatewayFilter Factory对请求进行限流
- 鉴权:网关层可以进行统一鉴权,实现Global Filters完成全局的鉴权,实现Gateway Filter可完成单个路由的鉴权
@Component
@Slf4j
public class GatewayAuthFilter implements GlobalFilter, Ordered {
//白名单
private static List<String> whitelist = null;
static {
//加载白名单
try (
InputStream resourceAsStream = GatewayAuthFilter.class.getResourceAsStream("/security-whitelist.properties");
) {
Properties properties = new Properties();
properties.load(resourceAsStream);
Set<String> strings = properties.stringPropertyNames();
whitelist= new ArrayList<>(strings);
} catch (Exception e) {
log.error("加载/security-whitelist.properties出错:{}",e.getMessage());
e.printStackTrace();
}
}
@Autowired
private TokenStore tokenStore;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String requestUrl = exchange.getRequest().getPath().value();
AntPathMatcher pathMatcher = new AntPathMatcher();
//白名单放行
for (String url : whitelist) {
if (pathMatcher.match(url, requestUrl)) {
return chain.filter(exchange);
}
}
//检查token是否存在
String token = getToken(exchange);
if (StringUtils.isBlank(token)) {
return buildReturnMono("没有认证",exchange);
}
//判断是否是有效的token
OAuth2AccessToken oAuth2AccessToken;
try {
oAuth2AccessToken = tokenStore.readAccessToken(token);
boolean expired = oAuth2AccessToken.isExpired();
if (expired) {
return buildReturnMono("认证令牌已过期",exchange);
}
return chain.filter(exchange);
} catch (InvalidTokenException e) {
log.info("认证令牌无效: {}", token);
return buildReturnMono("认证令牌无效",exchange);
}
}
3.还有其他网关吗?
网关常用的还有Zuul、基于Nginx的OpenResty
4.和过滤器相比的区别:
- 过滤器:对单个服务器的请求进行拦截控制
- 网关:对所有的服务器的请求进行拦截控制
5.zuul和spring cloud gateway的对比
- zuul:是Netflix的,是基于servlet实现的,阻塞式的api,不支持长连接。
- gateway:是springcloud自己研制的微服务网关,是基于Spring5构建,能够实现响应式非阻塞式的Api,支持长连接
6.网关和nginx的区别
- 相同点:都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。
- 不同点:
- Nginx采用C语言编写,Gateway属于Java语言编写的, 能够更好让我们使用java语言来实现对请求的处理。
- Nginx 属于服务器端负载均衡器。
- Gateway 属于本地负载均衡器。原文链接: 7.主要组成部分
- Route(路由): 网关的基本构件。它由一个ID、一个目的地URI、一个谓词(Predicate)集合和一个过滤器(Filter)集合定义。如果集合谓词为真,则路由被匹配。
- Predicate(谓词): 这是一个 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。这让你可以在HTTP请求中的任何内容上进行匹配,比如header或查询参数。
- Filter(过滤器): 这些是 GatewayFilter 的实例,已经用特定工厂构建。在这里,你可以在发送下游请求之前或之后修改请求和响应。
二、SpringSecurity
Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。
1.认证
- SecurityContextHolder
Spring Security 的认证模型的核心是 SecurityContextHolder
。它包含了SecurityContext。