微服务-gateway鉴权

news2024/12/25 0:38:40

文章目录

  • 一、前言
  • 二、gateway鉴权
    • 1、依赖配置
    • 2、编写代码
    • 3、GlobalFilter详解
      • 3.1、GlobalFilter简介
      • 3.2、GlobalFilter自定义执行顺序
      • 3.2.1、实现Order接口实现自定义执行顺序

一、前言

网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性。

RBAC基于角色访问控制,目前使用最为广泛的权限模型。相信大家对这种权限模型已经比较了解了。此模型有三个用户、角色和权限,在传统的权限模型用户直接关联加了角色,解耦了用户和权限,使得权限系统有了更清晰的职责划分和更高的灵活度

二、gateway鉴权

在这里插入图片描述

1、依赖配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--json-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${fastjson.version}</version>
</dependency>

2、编写代码

@Order(1)
@Component
public class AuthorizationFilter implements GlobalFilter {

    @Autowired
    private AuthConfig myConfig;

    @Autowired
    private AuthService authService;
    @Autowired
    private RedisUtil redisUtil;


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

        ServerHttpResponse response = exchange.getResponse();
        JSONObject message = new JSONObject();
        ServerHttpRequest request = exchange.getRequest();
        //1、获取请求路径
        String path = request.getPath().toString();

        //处理白名单内不需要进行拦截的地址
        if(!Objects.isNull(myConfig.getWhiteList())){
            for (String whitePath : myConfig.getWhiteList()) {
                if(path.contains(whitePath)){
                    return chain.filter(exchange);
                }
            }
        }

        //获取对应的token
        String token = request.getHeaders().getFirst("Authorization");
        //判断传递了token才可以继续解析
        if(!StringUtils.isEmpty(token)){
            try {
                //先去本地redis根据token获取value
                String userPhoneRedis = redisUtil.getTokenKey(token);
                //如果没有查到,或者过期时间小于10分钟,则去权限获取信息,权限会进行token续约
                if (Objects.isNull(userPhoneRedis) || redisUtil.getExpire(userPhoneRedis) < 600) {
                    String userId=authService.checkToken(token);
                    //如果校验token成功
                    if(null!=userId){
                        //缓存到redis中,一段时间内都不用校验token了
                        //token为key,用户id为value,存储7200秒(2小时)
                        redisUtil.set(token,userId,7200);
                        //放行继续向下调用
                        return chain.filter(exchange);
                    }
                }else{
                    return chain.filter(exchange);//放行继续向下调用
                }
            }catch (Exception e){
                //拦截请求,返回状态码401
                message.put("status", -1);
                message.put("data", "鉴权失败");
                byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
                DataBuffer buffer = response.bufferFactory().wrap(bits);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                //指定编码,否则在浏览器中会中文乱码
                response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
            }
        }
        message.put("status", -1);
        message.put("data", "鉴权失败");
        byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
        DataBuffer buffer = response.bufferFactory().wrap(bits);
        response.setStatusCode(HttpStatus.UNAUTHORIZED);
        //指定编码,否则在浏览器中会中文乱码
        response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
        return response.writeWith(Mono.just(buffer));
    }
}

3、GlobalFilter详解

3.1、GlobalFilter简介

GlobalFilter是Spring Cloud Gateway中用于过滤请求的组件,它可以在请求与路由匹配时,将所有的GlobalFilter和特定的GatewayFilter添加到过滤器链中,然后按照org.springframework.core.Ordered接口排序执行。

GlobalFilter具有与GatewayFilter相同的签名,因此可以在处理请求之前和之后执行一些操作,例如检查请求头、修改请求参数、验证权限等。在实现GlobalFilter接口时,需要实现filter方法,该方法接受一个WebExchange作为参数。

在Spring Cloud Gateway中,有一些默认的GlobalFilter,例如ForwardRoutingFilter和RouteToRequestUrlFilter,它们分别用于将请求转发到当前网关实例本地接口和将请求路由到指定的URL。

当请求与路由匹配时,过滤web处理程序会将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链中。这个组合过滤器链由org.springframework.core.Ordered接口排序,您可以通过实现getOrder()方法来设置该接口,值越小,越先执行。由于Spring Cloud Gateway区分了过滤器逻辑执行的“pre”和“post”阶段,优先级最高的过滤器是“pre”阶段的第一个,“post”的最后一个。

3.2、GlobalFilter自定义执行顺序

在gateway模块中有多个GlobalFilter时,你可以通过实现Ordered接口,或者使用@Order注解来指定每个GlobalFilter的执行顺序。order值越小,优先级越高,执行顺序越靠前。

如果多个GlobalFilter的order值一样,会按照默认的顺序执行,这个默认顺序是:defaultFilter > 路由过滤器 > GlobalFilter。
在这里插入图片描述
在这里插入图片描述
例如,在我的网关模块中,有两个自定义的GlobalFilter,一个用于做跨域处理,一个用户做权限鉴权,我们需要指定它们的执行顺序,优先应该走权限鉴权的,假如你都没有权限去请求服务,那么就不需要再去考虑当前请求是否跨域了。以上图片展示是通过@Order的方式实现的GlobalFilter自定义执行顺序;

3.2.1、实现Order接口实现自定义执行顺序

import org.springframework.cloud.gateway.filter.GlobalFilter;  
import org.springframework.cloud.gateway.filter.GatewayFilterChain;  
import org.springframework.core.Ordered;  
import org.springframework.stereotype.Component;  
import org.springframework.web.server.ServerWebExchange;  
import reactor.core.publisher.Mono;  
  
@Component  
public class CustomGlobalFilter implements GlobalFilter, Ordered {  
  
    @Override  
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
        // 在请求处理之前执行一些操作  
        // ...  
  
        // 继续执行下一个过滤器或路由处理程序  
        return chain.filter(exchange);  
    }  
  
    @Override  
    public int getOrder() {  
        // 返回该过滤器的优先级值,值越小优先级越高  
        return 1;  
    }  
}

这个示例中,我们创建了一个名为CustomGlobalFilter的类,它实现了GlobalFilter和Ordered接口。在filter()方法中,我们可以执行一些在请求处理之前需要执行的操作。getOrder()方法返回该过滤器的优先级值,这里我们返回了1,表示该过滤器将优先执行。

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

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

相关文章

Solidity 小白教程:6. 引用类型, array, struct

Solidity 小白教程&#xff1a;6. 引用类型, array, struct 这一讲&#xff0c;我们将介绍solidity中的两个重要变量类型&#xff1a;数组&#xff08;array&#xff09;和结构体&#xff08;struct&#xff09;。 数组 array 数组&#xff08;Array&#xff09;是solidity常…

【原创】H3C交换机STP协议测试

网络拓扑图 交换机信息 交换机1信息&#xff1a; <H3C>dis stp -------[CIST Global Info][Mode MSTP]-------Bridge ID : 32768.06fd-8165-0100Bridge times : Hello 2s MaxAge 20s FwdDelay 15s MaxHops 20Root ID/ERPC : 0.08c0-212c-0ff0,…

[NSSCTF Round #15NSSCTF 2nd]——Web、Misc、Crypto方向 详细Writeup

前言 虽然师傅们已经尽力了&#xff0c;但是没拿到前十有点可惜&#xff0c;题很好吃&#xff0c;明年再来&#xff08;&#xff09; 关于wp&#xff1a; 因为我没有学过misc&#xff0c;但是比赛的时候还是运气好出了三道&#xff0c;所以wp就只把做题步骤给出&#xff0c;也…

vue从零开始学习

npm install慢解决方法&#xff1a;删掉nodel_modules。 5.0.3&#xff1a;表示安装指定的5.0.3版本 ~5.0.3&#xff1a;表示安装5.0X中最新的版本 ^5.0.3: 表示安装5.x.x中最新的版本。 yarn的优点&#xff1a; 1.速度快&#xff0c;可以并行安装 2.安装版本统一 项目搭建&…

【Linux】线程安全-生产者消费者模型

文章目录 生产者消费者模型123规则应用场景优点忙闲不均生产者和消费者解耦支持高并发 代码模拟 生产者消费者模型 123规则 1个线程安全的队列&#xff1a;只要保证先进先出特性的数据结构都可以称为队列 这个队列要保证互斥&#xff08;就是保证当前只有一个线程对队列进行操…

[HNCTF 2022] web 刷题记录

文章目录 [HNCTF 2022 Week1]easy_html[HNCTF 2022 Week1]easy_upload[HNCTF 2022 Week1]Interesting_http[HNCTF 2022 WEEK2]ez_SSTI[HNCTF 2022 WEEK2]ez_ssrf [HNCTF 2022 Week1]easy_html 打开题目提示cookie有线索 访问一下url 发现要求我们输入手机号&#xff0c;可是只…

工控上位机程序为什么只能用C语言?

工控上位机程序并不只能用C#开发&#xff0c;实际上在工业自动化领域中&#xff0c;常见的上位机开发语言包括但不限于以下几种&#xff1a;C#: C#是一种常用的编程语言&#xff0c;在工控领域中被广泛使用。它具有良好的面向对象特性和丰富的类库支持&#xff0c;可以实现高性…

Oracle数据库安装,在自己的windows电脑上面。

第一步&#xff1a;找到数据库和数据库图形用户界面安装包。 直接用迅雷下载&#xff1a;数据库分为服务器端和客户端。 服务器端 操作系统&#xff1a;Windows Server 2008 企业版64位 Oracle软件:Oracle 11g 64位 客户端 操作系统&#xff1a;Windows7 64位 图形界面工…

ClickHouse进阶(五):副本与分片-1-副本与分片

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

【人工智能】—_神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵&#xff08;Cros…

分布式 - 服务器Nginx:基础系列之Nginx简介 | 下载安装 | 启动和停止服务

文章目录 01. Nginx 简介02. 正向代理和反向代理03. Nginx 和 Apache、Tomcat 之间的不同点04. Nginx 的优点05. Nginx 常用的功能特性06. Nginx 下载07. Nginx 安装1. 源码安装前的环境准备2. Nginx 源码简单安装方式3. Nginx yum 安装方式4. Nginx 源码复杂安装方式 08. Ngin…

一阴一阳之谓道,乃自然规律也!

阴阳&#xff0c;在我们国家&#xff0c;是一切传统文化的基础。作为一个有着五千年文化的国家&#xff0c;作为世界上仅存的四大文明古国&#xff0c;峰民觉得&#xff0c;我们的传统文化&#xff0c;不能被当成迷信&#xff0c;慢慢的没落。 有时&#xff0c;不得不承认&…

学习Bootstrap 5的第二天

​​​​​​​ 目录 前言 网格系统 网格类 网格系统规则 网格的基本结构 网格选项 从堆叠到水平 自动布局列 超小型设备 超小型设备网格实例 自动布局列 小型设备 小型设备网格实例 自动布局列 中型设备 中型设备网格实例 自动布局列 大型设备 大型设备网…

移除链表元素_每日一题

“路虽远&#xff0c;行则将至” ❤️主页&#xff1a;小赛毛 ☕今日份刷题&#xff1a;移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例1&…

反射、Class

Class 获取实例化的三种方式

从零开始搭建AI网站(6):如何使用响应式编程

响应式编程&#xff08;Reactive Programming&#xff09;是一种编程范式&#xff0c;旨在处理异步数据流和事件流。它通过使用观察者模式和函数式编程的概念&#xff0c;将数据流和事件流抽象为可观察的序列&#xff0c;然后通过操作这些序列来实现各种功能。 在响应式编程中…

NetSuite as OIDC Provider 演示

书接上回。上次谈了借助第三方身份认证服务SSO登录NetSuite。 NetSuite OIDC、SAML SSO 演示_NetSuite知识会的博客-CSDN博客NetSuite的SSO的策略&#xff1a;第三方的身份认证服务商NetSuite as OIDC Provider。本文演示前者。https://blog.csdn.net/remottshanghai/article/…

“智越”界限,SSOT上海国际智慧办公展览会来啦

随着人工智能、大数据、云计算等技术的快速发展&#xff0c;目前物联网应用已经从概念踏进规模部署的阶段&#xff0c;场景化和规模化已成常态。传统办公室作为企业行政运营的核心场景&#xff0c;也开始受到“科技办公“移动办公”“共享办公”等非传“智慧办公”概念的影响不…

SpringCloudAlibaba Gateway(二)详解-内置Predicate、Filter及自定义Predicate、Filter

Predicate(断言) ​ Predicate(断言)&#xff0c;用于进行判断&#xff0c;如果返回为真&#xff0c;才会路由到具体服务。SpirnngCloudGateway由路由断言工厂实现&#xff0c;直接配置即生效&#xff0c;当然也支持自定义路由断言工厂。 内置路由断言工厂实现 ​ SpringClo…

电子学会 2023年3月 青少年软件编程Python编程等级考试三级真题解析(选择题+判断题+编程题)

青少年编程Python编程等级考试三级真题解析(选择题+判断题+编程题) 2023年3月 一、选择题(共25题,共50分) 十进制数111转换成二进制数是?( ) A. 111 B. 1111011 C. 101111 D. 1101111 答案选:D 考点分析:考察python 进制转换 十进制转二进制,采用除二倒取余数,直到商…