OJ在线评测系统 微服务高级 网关跨域权限校验 集中解决跨域问题 拓展 JWT校验和实现接口限流降级

news2024/12/26 13:21:46

微服务网关跨域权限校验

集中的去解决一下跨域

这段代码是用来配置跨源资源共享(CORS)过滤器的。它创建了一个 CorsConfiguration 实例,允许所有方法和头部,并支持凭证(如 Cookies)。setAllowedOriginPatterns 方法设置允许的源,这里用 "*" 表示允许所有来源。最后,使用 UrlBasedCorsConfigurationSource 将该配置应用于所有路径(/**),并返回一个 CorsWebFilter 实例,以便在请求时进行 CORS 处理。

package com.yupi.yuojbackendgateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

import java.util.Arrays;

// 处理跨域
@Configuration
public class CorsConfig {

    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.setAllowCredentials(true);
        // todo 实际改为线上真实域名、本地域名
        config.setAllowedOriginPatterns(Arrays.asList("*"));
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

在网关层面

自定义一个跨域的拦截器

去给请求的响应头加上一个运行跨域的注解

package com.yupi.yuojbackendgateway.filter;

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.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;

@Component
public class GlobalAuthFilter implements GlobalFilter, Ordered {

    private AntPathMatcher antPathMatcher = new AntPathMatcher();

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest serverHttpRequest = exchange.getRequest();
        String path = serverHttpRequest.getURI().getPath();
        // 判断路径中是否包含 inner,只允许内部调用
        if (antPathMatcher.match("/**/inner/**", path)) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.FORBIDDEN);
            DataBufferFactory dataBufferFactory = response.bufferFactory();
            DataBuffer dataBuffer = dataBufferFactory.wrap("无权限".getBytes(StandardCharsets.UTF_8));
            return response.writeWith(Mono.just(dataBuffer));
        }
        // todo 统一权限校验,通过 JWT 获取登录用户信息
        return chain.filter(exchange);
    }

    /**
     * 优先级提到最高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

拓展

1.JWT校验

2.可以在网关实现接口限流降级

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;

// 在类中添加JWT密钥
private static final String SECRET_KEY = "your_secret_key"; // 请替换为你的密钥

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    ServerHttpRequest serverHttpRequest = exchange.getRequest();
    String path = serverHttpRequest.getURI().getPath();

    // 判断路径中是否包含 inner,只允许内部调用
    if (antPathMatcher.match("/**/inner/**", path)) {
        return respondWithForbidden(exchange, "无权限");
    }

    // JWT校验逻辑
    String authorizationHeader = serverHttpRequest.getHeaders().getFirst("Authorization");
    if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
        return respondWithForbidden(exchange, "缺少或格式不正确的Authorization头");
    }

    String token = authorizationHeader.substring(7); // 移除 "Bearer " 前缀
    try {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
        
        // 根据需要,您可以将用户信息提取并存储在请求的属性中
        // exchange.getAttributes().put("user", claims);
    } catch (SignatureException e) {
        return respondWithForbidden(exchange, "无效的JWT");
    } catch (Exception e) {
        return respondWithForbidden(exchange, "JWT校验失败");
    }

    return chain.filter(exchange);
}

private Mono<Void> respondWithForbidden(ServerWebExchange exchange, String message) {
    ServerHttpResponse response = exchange.getResponse();
    response.setStatusCode(HttpStatus.FORBIDDEN);
    DataBufferFactory dataBufferFactory = response.bufferFactory();
    DataBuffer dataBuffer = dataBufferFactory.wrap(message.getBytes(StandardCharsets.UTF_8));
    return response.writeWith(Mono.just(dataBuffer));
}

JWT密钥

private static final String SECRET_KEY = "your_secret_key"; // 请替换为你的密钥

用于签名和验证JWT的密钥。请确保此密钥保密,并使用安全的方式存储。

检查Authorization头

String authorizationHeader = serverHttpRequest.getHeaders().getFirst("Authorization");

获取请求头中的Authorization

Bearer Token处理

if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
    return respondWithForbidden(exchange, "缺少或格式不正确的Authorization头");
}

检查头是否存在且格式正确。

JWT解析和验证

Claims claims = Jwts.parser()
        .setSigningKey(SECRET_KEY)
        .parseClaimsJws(token)
        .getBody();

响应处理

private Mono<Void> respondWithForbidden(ServerWebExchange exchange, String message) {
    ...
}

抽取出的响应处理方法,方便在需要时发送403响应。

请确保JWT的签名和解析使用相同的密钥。

根据实际需要处理用户信息和权限。

思考:

企业级开发真的有必要用微服务吗

真的有必要用 Spring Cloud 实现微服务吗

大多数情况下 一般使用API RPC HTTP 实现跨部门 服务的实现

各部门直接共享一套接口的定义

数据格式 和 调用代码全部自动生成 保持统一 同时解耦

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

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

相关文章

基于SSM+小程序的教育培训管理系统(教育3)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 基于SSM小程序的教育培训管理系统&#xff08;教育3&#xff09; 1、项目介绍 1、管理员权限操作的功能包括增删改查网课信息&#xff0c;教师信息&#xff0c;学生信息&#xff0c;试卷&#xff0c;…

多元化网络团队应对复杂威胁

GenAI、ML 和 IoT 等技术为威胁者提供了新的工具&#xff0c;使他们更容易针对消费者和组织发起攻击。 从诱骗受害者陷入投资骗局的Savvy Seahorse &#xff0c;到使用 ChatGPT 之类的程序感染计算机并阅读电子邮件的自我复制 AI 蠕虫&#xff0c;新的网络威胁几乎每天都在出现…

【机器学习】探索机器学习在医疗影像分析中的应用

1. &#x1f680; 引言1.1 &#x1f680; 医疗影像分析的现状与发展趋势1.2 &#x1f4dc; 机器学习在医疗影像分析中的核心概念1.3 &#x1f3c6; 医疗影像分析在临床应用中的作用 2. &#x1f50d; 医疗影像分析的演变与创新2.1 &#x1f31f; 医疗影像分析的发展历程2.2 &am…

SQl注入文件上传及sqli-labs第七关less-7

Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时&#xff0c;表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时&#xff0c;表示限制mysqld只能在/tmp目录中执行导入导出&#xff0c;其他目录不能导出导入。 secure_fil…

linux信号 | 信号的补充知识

前言&#xff1a;本节内容主要是一些linux信号的周边知识或者补充知识。 对于信号的学习&#xff0c; 学习了信号概念&#xff0c; 产生&#xff0c; 保存与捕捉就已经算是认识我们的信号了。 如果想要知道更多关于信号的知识也可以看一下本篇文章。 ps&#xff1a;本篇内容适…

CSS——文字渐入效果

CSS——文字渐入效果 昨天制作了文字的打字机效果&#xff08;CSS——文字打字机效果&#xff09;&#xff0c;然后我想到有些网页的文字效果是平滑渐入的&#xff0c;我就去思考这样的实现方式&#xff0c;其实就把之前的steps()函数去掉即可&#xff0c;但是我想换种实现方式…

电脑无法无线投屏的解决办法

在前司的时候经常遇到电脑无法使用无线投屏器的情况&#xff0c;今天就来聊聊如何解决。 1.不会连接。这种情况&#xff0c;经常发生在WIN10升级WIN11之后&#xff0c;一般是两种办法&#xff0c;一种是同时按键盘上的WINDOWS和K键&#xff0c;右下角就会出来连接的图标&#…

Day8:返回倒数第k个节点

题目&#xff1a; 实现一种算法&#xff0c;找出单向链表中倒数第k个节点。返回该结点的值。 示例&#xff1a; 输入&#xff1a;1->2->3->4->5和k2 输出&#xff1a;4 说明&#xff1a; 给定的k保证是有效的。 public int kthToLast(ListNode head,int k){…

《动手学深度学习》Pytorch 版学习笔记一:从预备知识到现代卷积神经网络

前言 笔者有一定的机器学习和深度学习理论基础&#xff0c;对 Pytorch 的实战还不够熟悉&#xff0c;打算入职前专项突击一下 本文内容为笔者学习《动手学深度学习》一书的学习笔记 主要记录了代码的实现和实现过程遇到的问题&#xff0c;不完全包括其理论知识 引用&#x…

GRASP七大基本原则+纯虚构防变异

问题引出 软件开发过程中&#xff0c;需要设计大量的类&#xff0c;使他们交互以实现特定的功能性需求。但是不同的设计方式&#xff0c;对程序的非功能性需求&#xff08;可扩展性&#xff0c;稳定性&#xff0c;可维护性等&#xff09;的实现程度则完全不同。 有没有一种统一…

动态规划算法——三步问题

1.题目解析 2.算法原理 本题可以近似看做泰波那契数列&#xff0c;即小孩到第一个台阶需要一步&#xff0c;到第二个台阶则是到第一个台阶的步数加上第一阶到第二阶的步数&#xff0c;同理第三阶就是第二阶的步数加上第二阶到第三阶的步数&#xff0c;由于小孩只能走三步&#…

基于STM32的智能垃圾桶控制系统设计

引言 本项目设计了一个基于STM32微控制器的智能垃圾桶控制系统&#xff0c;能够通过超声波传感器检测手部动作&#xff0c;自动打开或关闭垃圾桶盖&#xff0c;提升用户的便利性和卫生性。该项目展示了STM32微控制器在传感器检测、伺服电机控制和嵌入式智能控制中的应用。 环…

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法

如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。&#xff08;注意&#x…

毕业设计选题:基于ssm+vue+uniapp的模拟考试小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

2024最新 Navicat Premium 17 简体中文版安装图文详细教程

Navicat 17 引入了一系列新特性&#xff0c;旨在提升用户体验和工作效率。以下是一些值得关注的新功能&#xff1a; ‌模型工作区的全面重新设计‌&#xff1a;包含了增强的图表设计、更强大的同步工具、数据字典支持等多项功能。这有助于在一个工作区中创建多个模型&#xff0…

集合论基础 - 离散数学系列(一)

目录 1. 集合的基本概念 什么是集合&#xff1f; 集合的表示方法 常见的特殊集合 2. 子集与幂集 子集 幂集 3. 集合的运算 交集、并集与补集 集合运算规则 4. 笛卡尔积 5. 实际应用 6. 例题与练习 例题1 练习题 总结 引言 集合论是离散数学的基础之一&#xff…

HarmonyOS第一课 04 应用程序框架基础-习题分析

判断题 1.在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。T 正确(True) 错误(False) 这个答案是T - AppScope > app.json5&#xff1a;app.json5配置文件&#xff0c;用于声明应用的全局配置信息&#xff0c;比如应用…

利用大规模语言模型提高生物医学 NER 性能的新方法

概述 论文地址&#xff1a;https://arxiv.org/pdf/2404.00152.pdf 大规模语言模型在零拍摄和四拍摄任务中表现出色&#xff0c;但在生物医学文本的独特表达识别&#xff08;NER&#xff09;方面仍有改进空间。例如&#xff0c;Gutirrez 等人&#xff08;2022 年&#xff09;的…

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功…

医院伤病员食堂批量打印—未来之窗行业应用跨平台架构

一、订单后厨打印批量 在医院伤员管理中&#xff0c;预约订单现场打印的方式往往不太合适。现场打印可能会导致效率低下&#xff0c;尤其在伤员较多、情况紧急的时候&#xff0c;容易造成混乱和延误。 采用统一打印的方式具有诸多优势。首先&#xff0c;能够集中处理打印任务&…