基于Redis的网关鉴权方案与性能优化

文章目录

  • 前言
  • 一、微服务鉴权
    • 1.1 前端权限检查
    • 1.2 后端权限检查
    • 1.3 优缺点
  • 二、网关鉴权
    • 2.1 接口权限存储至Redis
    • 2.2 网关鉴权做匹配
  • 总结

前言

在微服务架构中,如何通过网关鉴权结合Redis缓存提升权限控制的效率与性能。首先,文章对比了两种常见的权限检查方式:前端权限检查和网关鉴权。前端权限检查可以实现精细化的权限控制,但每个接口需要加注解,操作繁琐;而网关鉴权通过在网关层统一处理权限验证,减少了后端服务的负担,但对于Restful风格的API缺乏精细化控制,并且可能影响网关性能。

一、微服务鉴权

在这里插入图片描述

1.1 前端权限检查

前端通过if-else判断用户是否配置按钮权限,以此来显示或者隐藏,前端参考代码如下:

在这里插入图片描述

1.2 后端权限检查

后端通过@PreAuthorize注解来检查权限方法,这就是spring security提供的方法级别的权限拦截,使用的时候我们需要开启方法拦截,如下:

在这里插入图片描述
在需要权限拦截的方法上加入注解:

在这里插入图片描述
当然还有角色标识的拦截:

在这里插入图片描述

1.3 优缺点

前端权限检查的方式,据我所接触到的项目,基本都是这种壳子,还有哪些特殊的方式,欢迎大家评论区留言,小编也想参考学习。

优点: 比较灵活,可以达到精细化控制,比如RestFul风格的api,只需要一个注解即可达到控制的效果。
缺点: 太繁琐了,每个接口都要加这个注解,并且微服务OAuth2体系中,一般需要提供一个资源服务来做鉴权。

二、网关鉴权

网关授权就是基于接口路径匹配,请求在经过网关的时候校验当前请求的路径是否在用户拥有的资源路径中。

优点: 所有后端服务不需要关注接口权限,不用加注解那么繁琐。
缺点: 如果项目是RestFul风格的api,不能精细化的控制,其次会影响网关的性能。

针对网关鉴权的缺点,我们可以做一些改进,比如项目不采用RestFul风格的api编写,其实市面上很少有全部遵循RestFul风格的代码,我们将请求入参统一采用对象接受,并且每个接口方法都是唯一的,如新增和修改隔离开来,这样就可以解决精细化控制问题,其次性能上面,我们可以将角色拥有的资源路径存储在redis中与之比对,这样就加快鉴权速度,也提升了性能。

2.1 接口权限存储至Redis

核心代码如下:

redisUtils.setCacheSet(ROLE_METHOD_KEY + roleCode, methods);

在这里插入图片描述

2.2 网关鉴权做匹配

核心代码如下:

// 网关鉴权
boolean status = authorities != null && authorities.stream().anyMatch(userRole -> redisUtils.hasCacheSet(RedisCacheConstants.ROLE_METHOD_KEY + userRole, methodUrl));
if (!status) {log.warn("403 Unauthorized resource handler,username:{}, methodUrl:{}", username, methodUrl);return RestExceptionHandler.responseErrorJson(exchange, ResultEnum.ACCESS_UNAUTHORIZED);
}

我们通过Redis的 isMember() 方法来检测路径是否匹配,其时间复杂度是 O(1),对于 Redis 来说,它的性能非常好。通过将权限数据存储到Redis,可以避免每次请求都进行数据库查询,提高系统的响应速度和吞吐量。

总结

随着微服务架构的发展,使用网关进行权限鉴权结合Redis缓存是一种高效且安全的解决方案。通过这种方式,能够减轻后端服务的开发压力,同时在保证权限控制精度的同时,也提升了系统的性能。对于需要高并发、高性能的分布式系统,采用此方法具有显著优势。

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

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

相关文章

leetcode-283.移动零-day13

方法一:双指针遇 0 交换 1. 基本思路回顾 该方法使用了两个指针m和i,m用于标记当前已经处理好的非零元素应该放置的位置,i用于遍历整个数组。当遇到nums[m]为0时,会通过内层while循环找到下一个非零元素(如果存在的话…

【Python入门】Python控制成分

文章一览 一 、顺序结构二、分支结构多分支结构 三、循环结构1. for语句循环结构range()函数 2. while语句构成循环1)while 循环流程 3、for 循环和 while 循环的区别4、for 循环和 while 循环效率比较 四、函数1、函数定义1) 内置函数2) 非内…

scala中模式匹配的应用

package test34object test6 {case class Person(name:String)case class Student(name:String, className:String)// match case 能根据 类名和属性的信息,匹配到对应的类// 注意:// 1 匹配的时候,case class的属性个数要对上// 2 属性名不需…

【D3.js in Action 3 精译_046】DIY 实战:在 Observable 平台利用饼图布局函数实现 D3 多个环形图的绘制

当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(一)5.1.2 饼图布局生成器(二)5.1.3 圆弧的绘制(三)5.1.4 数据标签的添加(四&#…

IP地址查询的背后②:IP地址(IPv4)的构成、类型以及子网划分

自从各大平台将IP地址显示之后,相信广大网友对于IP地址相当不陌生了。而我们见到的IP地址往往只会显示在某市,更仔细的会看到有一段段字节所显示的字符串,而IP地址看似由很简单的1-255之间的数字所组成的四个部分,但其实质上则是二…

使用 DeepSpeed 微调 OPT 基础语言模型

文章目录 OPT 基础语言模型Using OPT with DeepSpeedmain.py 解析1、导入库和模块2、解析命令行参数3、main 函数3.1 设备与分布式初始化3.2 模型与数据准备3.3 定义评估函数3.4 优化器与学习率调度器设置3.5 使用 deepspeed 进行模型等初始化3.6 训练循环3.7 模型保存 4、dsch…

计算机网络-GRE Over IPSec实验

一、概述 前情回顾:上次基于IPsec VPN的主模式进行了基础实验,但是很多高级特性没有涉及,如ike v2、不同传输模式、DPD检测、路由方式引入路由、野蛮模式等等,以后继续学习吧。 前面我们已经学习了GRE可以基于隧道口实现分支互联&…

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动 Turtle库是Python标准库的一部分,它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”(Turtle)对象在屏幕上移动…

《计算机组成及汇编语言原理》阅读笔记:p9-p27

《计算机组成及汇编语言原理》学习第 2 天,p9-p27 总结,总计 19 页。 一、技术总结 1.quantum physics(量子物理学) (1)quantum(量子) quantum的本意是:c. the smallest amount of sth(量子)。 In physics, a quantum is the minimum am…

Qt:QMetaObject::connectSlotsByName实现信号槽自动关联

简介 在Qt中,QMetaObject::connectSlotsByName 是一个便利的方法,它可以根据对象的对象名(objectName)自动将信号和槽连接起来。但是,要使用这个方法,必须确保: 1 控件(如按钮&…

国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异

在现代安防视频监控系统中,国标GB28181协议作为公共安全视频监控联网系统的国家标准,该协议不仅规范了视频监控系统的信息传输、交换和控制技术要求,还为不同厂商设备之间的互联互通提供了统一的框架。EasyGBS平台基于GB28181协议&#xff0c…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率,二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…

长短期记忆网络(LSTM):深度学习中的序列数据处理利器

目录 ​编辑 长短期记忆网络(LSTM):深度学习中的序列数据处理利器 引言 LSTM的起源与背景 LSTM的核心机制 LSTM的优势 LSTM的应用案例 LSTM的研究进展 LSTM的变种 LSTM的改进 LSTM的最新研究 结论 长短期记忆网络(LST…

2024年前端面试题【基本功篇】

文章目录 前言一、html 相关1.1 行内元素和块级元素分别有哪些?1.2 IE盒子模型和标准盒子模型 二、css 相关2.1 选择器2.2 设置垂直居中的方法2.3 定位的几种方式2.4 清除浮动的几种方式2.5 rem、em、px、vw、vh区别2.6 响应式和自适应布局的区别2.7 元素隐藏的几种…

Excel设置生日自动智能提醒,公式可直接套用!

大家好,我是小鱼。 今天跟大家分享一个WPS表格中根据出生日期,设置生日提醒,并且根据距离生日天数自动标记数据颜色。简单又实用,一个公式轻松搞定! 接下来我们先学习一下需要使用到的函数,然后再根据实例让…

【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南

硬件:Apple M4 Pro 16寸 系统: macos Sonoma 15.1.1 Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于全球各地的网站和企业应用中。本文将详细介绍如何在 macOS 环境下使用 Homebrew 安装、启动、管理以及优化配置 Nginx&#x…

安卓环境配置及打开新项目教程,2024年12月20日最新版

1.去官网下载最新的Android Studio,网址:https://developer.android.com/studio?hlzh-cn 2.下载加速器,注册账号,开启加速器。网址:放在文末。 3.下载安卓代码,项目的路径上不能有中文,特别是…

VMware虚拟机Ubuntu 18.04版本 磁盘扩容

一、版本配置 虚拟机版本:VMware WORKSTATION 16 PRO Ubuntu版本:Ubuntu 18.04 二、磁盘大小介绍 目的:磁盘扩容(20G----->100G),从20G扩到100G 查看磁盘大小命令:df -h 扩容前的磁盘大小 …

10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹

本文记录当前最新版虚拟机VMware Workstation Pro(2024.12)如何在win11下共享文件,以实现Windows与Ubuntu互传文件的目的。 1. 创建共享文件夹 1.1 先关闭虚拟机的客户机,打开虚拟机设置 1.2 在虚拟机设置界面找到“选项”->“…

HTTP—03

触发 GET 请求 1)直接在浏览器 地址栏 输入 URL,此时构成了一个GET请求 2)HTML中的一些特殊标签可能会触发 例如 img,a,link,script... 3)通过Form表单触发(Form本质也是一个HTML标签) 4&#xff0…