实战讲解网关接口统一认证SpringCloudGateway(图+文)

news2025/1/16 18:49:31

1 缘起

继gateway限流篇:https://blog.csdn.net/Xin_101/article/details/127890605
之后,继续补充网关统一鉴权的相关应用,
网关作为所有流量入口,承接所有请求,因此,可以在网关层统一做鉴权,
授权的放行,未授权的禁行,这里,可以添加黑白名单的功能,
白名单,无需鉴权,直接放行;
黑名单,直接禁行,
本文,即通过实战讲解网关鉴权以及黑白名单的使用。

2 架构

整体架构如下图所示,
由图可知,该体系共有三部分:
(1)网关层:做统一鉴权,保护后面的服务;
(2)注册中心层:管理所有服务;
(3)服务层:业务或其他功能性服务。
在这里插入图片描述

3 网关配置

网关配置的白名单是针对保护的资源,
当用户访问白名单的资源时,无需鉴权,即直接通过约定,即可获取正确的响应,
访问非白名单的资源时,需要鉴权成功后,才能获取正确的响应,否则,无法获取正确的响应。

3.1 白名单配置

白名单配置有两种方式,
(1)在启动的文件application.yml中配置;
(2)在数据库Redis或MySQL中配置,启动应用时,需要将数据加载到内存(JVM),
如何在SpringBoot启动时加载外部数据到内存参见:https://blog.csdn.net/Xin_101/article/details/127945236;
简单起见,本文直接在配置文件application.yml中配置白名单,
样例如下:

request:
  white-list:
    - /api/v1/get/test

3.2 白名单映射的实体

由上面的配置可知,映射的实体中数据类型为List,
白名单实体如下图所示,完整样例在图后面。
在这里插入图片描述

package com.monkey.gateway_template.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 请求白名单.
 *
 * @author xindaqi
 * @since 2022-11-19 15:23
 */
@Component
@ConfigurationProperties("request")
public class RequestWhiteList {

    /**
     * 白名单列表
     */
    List<String> whiteList;

    public List<String> getWhiteList() {
        return whiteList;
    }

    public void setWhiteList(List<String> whiteList) {
        this.whiteList = whiteList;
    }
}

3.2 请求链配置

为了使网关具有统一鉴权的功能,就需要在网关服务中添加请求拦截功能,通过实现GlobalFilter接口来拦截请求。
测试样例核心如下图所示,核心部分均有注释,源码在图后面。
这里为了方便测试,在非白名单鉴权时,没有做token校验,只判断是否在请求头中携带token,
实际应用中开发者自定这部分认证逻辑,比如通过Redis、JWT、Oauth2.0等。

在这里插入图片描述

package com.monkey.gateway_template.config;

import com.google.gson.Gson;
import com.monkey.gateway_template.response.Response;
import org.apache.http.HttpHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
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 javax.annotation.Resource;
import javax.ws.rs.core.MediaType;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;

/**
 * 请求拦截器(过滤器).
 *
 * @author xindaqi
 * @since 2022-11-19 15:18
 */
@Component
public class RequestFilter implements GlobalFilter, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(RequestFilter.class);

    private static final String TOKEN = "token";

    // 获取配置的白名单
    @Resource
    RequestWhiteList requestWhiteList;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        // 获取请求的URI,网关配置uri的lb时做了剪裁,所以,直接使用原生接口的URI,无需拼接其他内容
        String requestPath = exchange.getRequest().getPath().value();
        // 白名单接口直接放行
        if (Objects.nonNull(requestWhiteList) && requestWhiteList.getWhiteList().contains(requestPath)) {
            return chain.filter(exchange);
        }
        // 非白名单接口需要鉴权:请求头携带token
        List<String> tokenList = exchange.getRequest().getHeaders().get(TOKEN);
        // 这里为了方便测试,没有做token校验,只判断是否在请求头中携带token,
        // 实际应用中开发这自定这部分认证逻辑
        if (Objects.isNull(tokenList) || tokenList.size() == 0) {
            Gson gson = new Gson();
            // 这里开发者可以自定义响应的内容,我自己构建的对象Response
            byte[] data = gson.toJson(Response.invalidToken()).getBytes(StandardCharsets.UTF_8);
            ServerHttpResponse response = exchange.getResponse();
            DataBuffer buffer = response.bufferFactory().wrap(data);
            // 状态码配置:未授权401
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
            return response.writeWith(Mono.just(buffer));
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

4 测试

准备的测试接口如下:
接口由其他服务提供,测试使用的为自建的producer服务,原生接口URI如下表所示

序号状态接口
1白名单接口/api/v1/get/test
2非白名单接口/api/v1/biz/test

producer是通过网关进行访问的,网关和producer均注册到同一个注册中心集群,
所以无需关注producer的IP和PORT,通过网关已经配置,参见gateway限流篇:https://blog.csdn.net/Xin_101/article/details/127890605
所以请求时,通过网关的IP和PORT以及配置的断言Path,这里配置的为producer-server,
所以通过网关请求produer接口时需要添加produer-server前缀。
为了使限流生效,断言Path切不可与服务名相同。

4.1 白名单

白名单接口无需进行授权,直接访问,按照约定数据即可获取正确的数据。
测试结果如下图所示。
在这里插入图片描述

4.2 非白名单

非白名单接口需要进行鉴权,
授权通过后,方可获取正确的结果,如果授权失败,则返回未授权相关信息,
测试结果如下图所示。
在这里插入图片描述

5 小结

  • 白名单配置有两种方式,
    (1)在启动的文件application.yml中配置;
    (2)在数据库Redis或MySQL中配置,启动应用时,需要将数据加载到内存(JVM),
    如何在SpringBoot启动时加载外部数据到内存参见:https://blog.csdn.net/Xin_101/article/details/127945236;
  • 网关拦截请求核心是实现GlobalFilter接口,重写方法filter(ServerWebExchange exchange, GatewayFilterChain chain)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MIT6.830-2022-lab1实验思路详细讲解

文章目录前言一、6.830/Lab1 Start二、Exercise2.1、Exercise1&#xff1a;Fields and Tuples2.2、Exercise2&#xff1a;Catalog2.3、Exercise3&#xff1a;BufferPool2.4、Exercise4&#xff1a;HeapFile access method2.5、Exercise5&#xff1a;HeapFile2.6、Exercise6&…

DJ12-2-2 算术运算指令

目录 1. 加法指令 &#xff08;1&#xff09;ADD 指令 &#xff08;2&#xff09;ADC 指令 &#xff08;3&#xff09;INC 指令 2. 减法指令 &#xff08;1&#xff09;SUB 指令 &#xff08;2&#xff09;SBB 指令 &#xff08;3&#xff09;DEC 指令 &#xff08;4&…

Alluxio 2.9新版发布 | 重塑架构,支持大规模多租户环境

/ Alluxio宣布正式发布数据编排平台2.9版本 / Alluxio 2.9 版本的主要新增功能包括&#xff1a; 新增跨环境集群同步功能、增强Alluxio在Kubernetes上的可管理性、提高S3 API 安全性和用户体验 2022年11月17日&#xff0c;全球首创的开源数据编排软件开发商Alluxio宣布正式发…

1.2 分布

测度理论 (Durrett) 第五版 个人笔记 答案 Durrett高等概率论教材 (Probability) 攻读概率及统计/机器学习应用方向博士学位. Measure TheoryProbability SpacesDistributionsRandom VariablesIntegrationProperties of the IntegralExpected ValueProduct Measures, Fubini’…

[计算机毕业设计]机器视觉指纹识别图像识别

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

2022Q3运动户外行业数据分析(高增长概念解读)

本篇我们将继续来分析22年Q3季度中&#xff0c;运动户外行业的高增长概念。 在运动户外行业中&#xff0c;我们发现了3个高增长品类&#xff0c;分别是&#xff1a;泳镜、运动休闲鞋、运动包。 一、游泳用品高增长概念——泳镜 在功能上区分&#xff0c;泳镜可以分为竞速泳镜、…

十秒钟搞懂linux的软硬链接细节图解和目录结构文件的基本命令

秒懂linux链接图解一&#xff0c;软硬链接的分析1&#xff0c;软链接的图解&#xff1a;2&#xff0c;硬链接的图解3&#xff0c;软硬链接的区别4,目录创建软链接的语法格式二&#xff0c;linxu的根目录结构示意图和各部分的功能&#xff0c;可以根据单词部分记忆&#xff08;部…

SDN环境搭建(超详细)

文章目录前言一. 安装VMware workstation二、Ubuntn安装三、Mininet安装四、RYU安装五、WireShark安装六、在Mininet中启动可视化界面常见问题总结写在后面前言 最近在做SDN这方面的实验&#xff0c;在这里记录一下自己的学习过程和踩过的坑。 具体环境&#xff1a; VMware-wo…

RepGhost

轻量级的CNN模块重参数化技术构建硬件高效的 Ghost 模块,通过结构重新参数化技术开发一种硬件高效的 RepGhost 模块&#xff0c;以实现特征的隐式重用。RepGhostNet 把 Concat 操作去掉&#xff0c;同时修改现有结构以满足重参数化的规则。最终得到的 RepGhostNet 是一个高效的…

swift-类属性-MachO读取

上一篇 swift-类属性 为源码层面类属性结构剖析&#xff0c;接下来从MachO层面验证读取类属性内容 极简类结构 class IFLPerson2 {var age: Int 20var heigh: Double 180}MachO-__swift5_types读取 var size: UInt 0//__swift5_types section 的pFilevar ptr getsectdata(…

Alibaba内部传出的面试秘技,秋招offer尽收囊中

又逢“金九银十”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;…

修改Cmder默认命令提示符

修改Cmder默认命令提示符常规操作第二种方法我的方法参考常规操作 打开在Cmder目录下的vendor文件夹&#xff0c;编辑里面的clink.lua文件找到local lambda “λ”&#xff0c;将“λ”修改为“$”&#xff0c;如图&#xff08;图片来源&#xff1a;https://www.jianshu.com/…

11月“图无处不在”线上直播 - Neo4j宣布下一代图数据平台Neo4j 5上线

中国北京&#xff0c;2022年11月10日—— 图技术的领导者Neo4j 宣布下一代可用于云端的图数据平台Neo4j 5上线。在传统数据库的基础上&#xff0c;扩大了原生图的性能优势&#xff0c;同时在本地、云、混合云或多云部署中实现更高可扩展性&#xff0c;从而使企业能够更快地创建…

Java 集合---尚硅谷Java入门视频学习

问题&#xff1a;什么时候需要一个容纳数据的容器&#xff0c;也就是集合对象&#xff1f; Java集合框架中就包含了对不确定个数的数据处理的集合类问题&#xff1a;如果只是为了容纳数据&#xff0c;可以是直接使用数组&#xff0c;为什么要学习集合&#xff1f; 数组使用起来…

【论文阅读】多模态模型CoCa

Introduction 在这项工作中&#xff0c;我们统一了单编码器、双编码器和编码器-解码器范式&#xff0c;并训练了一个包含三种方法优点的图像-文本基础模型。我们提出了对比Captioner模型(CoCa)&#xff0c;该模型采用经过对比损失和captioning损失训练的编码器-解码器架构。如图…

C语言源代码系列-管理系统之职工工资管理系统

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

数据存储策略——lsm-tree

文章目录一、背景二、lsm-tree简介三、lsm-tree设计思想四、lsm-tree原理1.写操作2.读操作3.有序表持久化4.后台压缩五、lsm-tree的应用六、lsm-tree优缺点分析总结一、背景 由于传统机械磁盘的原理&#xff0c;它在读写时有个寻道的操作&#xff0c;在读写时都需要消耗一个寻…

基于PHP+MySQL网上报名系统的设计与实现

一直以来如何更好的实现校园现代化和信息化是当前很多高校一直探索的问题&#xff0c;随着时代的发展&#xff0c;高校内各类考试和报名也越来越多&#xff0c;如何通过互联网直接进行在线报名是本系统研究的一个重点内容。 本系统是一个网上报名系统&#xff0c;为了能够更加灵…

[计算机毕业设计]机器学习的数据驱动股票价格预测

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

财政政策与货币政策(下)

财政政策与货币政策(下) – 潘登同学的宏观经济学笔记 文章目录财政政策与货币政策(下) -- 潘登同学的宏观经济学笔记粘性价格下的货币经济总供给曲线总供给曲线斜率与价格粘性菲利普斯曲线的消失货币政策的“动态不一致”财政政策与货币政策的配合财政主导 vs. 货币主导恶性通…