权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽!

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽

一、SpringCloud GateWay

1.它是如何工作的?

image-20240330182101249

​ 客户端向 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(设定分流的权重)原文链接:https://blog.csdn.net/wen5026/article/details/122333171

  • 熔断:可以通过配置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 属于本地负载均衡器。原文链接:https://blog.csdn.net/bufegar0/article/details/117355172
    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的应用程序中。

image-20240331100652563

1.认证
  • SecurityContextHolder

    Spring Security 的认证模型的核心是 SecurityContextHolder。它包含了SecurityContext。

    image-20240331095107020

SecurityContext context = SecurityContextHolder.createEmptyContext(); 
Authentication authentication = new TestingAuthenticationToken("username", "password", "ROLE_USER"); 
context.setAuthentication(authentication);

SecurityContextHolder.setContext(context);
  • AbstractAuthenticationProcessingFilter

    image-20240331095508460

2.授权

Authentication 讨论了所有 Authentication 实现如何存储 GrantedAuthority 对象的列表。这些对象代表已经授予委托人(principal)的权限。GrantedAuthority 对象由 AuthenticationManager 插入到 Authentication 对象中,随后由 AccessDecisionManager 实例在做出授权决定时读取。

GrantedAuthority 接口只有一个方法。

String getAuthority();
3.防止攻击

主要提供了对CSRF、HTTP Header、HTTP的保护

三、OAuth2.0

1.OAuth2设计的角色
  • 资源所有者(Resource Owner) :通常是 用户(User) ,如昵称、头像这些资源的拥有者(用户只是将这些资源放到服务提供商的资源服务器中)。
  • 第三方应用 :或者称为第三方客户端(Clinet),希望使用资源服务器提供的资源
  • 认证服务器(Authorization Server) :专门用于对资源所有者的身份进行认证,对要访问的资源进行授权、产生令牌的服务器。访问资源,需要通过认证服务器由资源所有者授权才可以访问。
  • 资源服务器(Resource Server) :存储用户的资源,验证令牌有效性。比如:微信资源服务器存储了微信用户信息,淘宝资源服务器存储了淘宝的用户信息。
  • 服务提供商(Service Provider) :认证服务和资源服务归属于一个机构,该机构就是服务提供商。
2.授权码模式

image-20240331105941205

学成在线:

image-20240331110009967

四、JWT

JSON Web Token(JWT)是一种使用JSON格式传递数据的网络令牌技术,它是一个开放的行业标准(RFC 7519),用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任,它可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止内容篡改。

1.Header

头信息指定了该JWT使用的签名算法:

header = '{"alg":"HS256","typ":"JWT"}'
2.payload

消息体包含了JWT的意图:

payload = '{"loggedInAs":"admin","iat":1422779638}'//iat表示令牌生成的时间
3.signature

未签名的令牌由base64url编码的头信息和消息体拼接而成(使用"."分隔),签名则通过私有的key计算而成:

key = 'secretkey'  
unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)  
signature = HMAC-SHA256(key, unsignedToken)

最后在未签名的令牌尾部拼接上base64url编码的签名(同样使用"."分隔)就是JWT了:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature) 

# token看起来像这样: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI 
4.jwt和security的对比:

JWT的优点:

  • 无需再服务端存储用户数据,减轻服务端压力
  • 轻量级,json风格,比较简单
  • 跨语言

JWT的缺点:

  • token一旦签发,无法修改
    • 无法更新token有效期,用户登录状态刷新难以实现
    • 无法销毁一个token,服务端不能对用户状态进行绝对控制
  • 不包含权限控制

SpringSecurity:

  • 优点:
    • 用户信息保存再服务端,服务端可以对用户状态绝对控制
    • 基于Spring,无缝整合,修改登录逻辑,其实就是添加过滤器
    • 整合权限管理
  • 缺点:
    • 限定了语言
    • 实现复杂,基于一连串的过滤器链
    • 需要再服务端保存用户信息,增加服务端压力

五、RBAC

RBAC允许您通过分配一组权限来创建和实施高级访问。权限基于特定用户类别执行其职责所需的访问级别。换句话说,公司中的不同人员可以完全基于其工作职能和职责等因素拥有完全不同的访问权限级别和类型。

1.好处

RBAC最大的优点之一是它提供了一种系统化的方法,用于定义和维护角色,使您能够仅根据用户需要一致地授予访问权限,从而降低数据泄露或数据丢失的风险。

但RBAC还有很多其他好处,包括:

  • 通过根据人力资源属性自动为新员工分配访问权限来加速入职
  • 简化IT管理工作,例如,通过在全球范围内跨多个平台和应用程序快速重新分配权限
  • 改善对欧盟《一般数据保护规则》(GDPR)或美国《健康保险可移植性和责任法案》(HIPAA)等法规的遵守
  • 通过为供应商和业务合作伙伴等外部用户提供预定义的角色来降低第三方风险
  • 通过在角色更改时自动更新访问权限来维护“最低权限”的最佳实践
  • 降低高级访问控制的成本,尤其是在大型复杂环境中
2.缺陷

需要了解组织结构知识

没有一种一刀切的方法来定义角色。在决定如何对角色进行分类以及如何管理这些角色的访问权限时,组织必须跨部门协调。这需要清楚地了解组织的理想结构以及支持它的技术基础设施。

在大型或成长中的组织中,如果IT或安全经理需要在没有人力资源或执行决策者帮助的情况下定义角色,这可能是一项艰巨的任务,会变得更加困难。这种简化实施的常见尝试实际上使问题变得更糟,导致与公司更大的目标不一致。

需要深思熟虑的实施

分配角色可能是一项挑战。可能会出现很多问题,答案并不总是清晰的。例如:安全团队是否需要访问他们试图保护的数据,包含哪些访问权限(创建/读取/更新/删除)?是否应为用户分配部门之外的角色,以确保临时访问特权文件?

缺乏灵活性

RBAC以过于死板著称,这也难怪。组织成长,团队扩张,访问需求发生变化。在RBAC项目开始时定义的角色可能不再符合公司目标。

结果如何?人员的角色和权限级别可能不一致。例如,一个人可能被赋予过多的角色权限、分配过多的角色,或者两者兼而有之。虽然这些努力可能会起到快速修复的作用,但它们也会造成安全漏洞和法规遵从性挑战,从而打消了您最初实施RBAC的全部原因。

导致角色爆炸

一些团队试图通过定义越来越细粒度的角色、在出现新需求时创建临时角色,或将太多的角色分配给单个用户来回避上述问题。虽然这可能会在短期内缓解摩擦,但也会让RBAC变得混乱,难以管理。

这个问题通常被称为角色爆炸,是RBAC最常见的反对意见之一。当现实世界中的角色和访问需求与您的政策文件中概述的角色和访问需求不同时,甚至在很小的程度上也会出现这种情况。而作为临时解决方案创建的角色有时管理员可能会忘记或甚至故意选择保留这些角色,即使为其创建这些角色的人员离开或更换组织内的工作。结果是:特权蔓延和混乱。
AC的全部原因。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第十四届--异或和之和

题目描述 给定一个数组 Ai&#xff0c;分别求其每个子段的异或和&#xff0c;并求出它们的和。或者说&#xff0c;对于每组满足 1 ≤ L ≤ R ≤ n 的 L, R &#xff0c;求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L, R 得到的结果加起来的值。 输入格式 输入的第一…

基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 关键概念与模型 4.2数学模型 5.完整程序 1.程序功能描述 基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出ACO优化的收敛曲线&#xff0c;规划路径结果和每一条路径的满载率。 2.测试软…

C# MES通信从入门到精通(8)——C#调用Webservice服务进行数据交互

前言 在上位机开发领域,使用webservice来访问客户的终端Mes系统是一项必备的技能,本文详细介绍了如何在c#中调用webservice服务,不仅介绍了使用添加服务引用直接调用webservice中的方法外还介绍了使用http的post方法调用webservice方法,过程详细且均为实战经验总结,对于初…

十个排序算法

目录 冒泡排序(Bubble Sort) 选择排序(Select Sort) 插入排序&#xff08;InsertSort&#xff09; 希尔排序&#xff08;ShellSort&#xff09; 计数排序&#xff08;CountSort&#xff09; 快速排序&#xff08;QuickSort&#xff09; 归并排序&#xff08;Merge Sort&a…

chatGPT4无法登录

遇到问题&#xff1a;chatgpt网站上点击登录&#xff08;log in),网站就会跳转并显示&#xff1a;unable to connect 解决方法&#xff1a;不要用亚洲节点&#xff0c;亚洲节点被全面封禁&#xff0c;在全局代理中可以换成美国的节点

故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab) 模型描述 偏最小二乘法(Partial Least Squares, PLS)是一种统计建模方法,用于建立变量之间的线性关系模型。它是对多元线性回归方法的扩展,特别适用于处理高维数据和具有多重共线性的数据集。…

Idea显示无法自动装配。找不到‘ xxx’类型的Bean

虽然只标红&#xff0c;不报错&#xff0c;但是看着非常别扭&#xff01; 原因&#xff1a; 当我们在使用Autowired注解的时候&#xff0c;默认requiredtrue,表示注入的时候bean必须存在&#xff0c;否则注入失败。 解决方案一&#xff1a; 在自动转配的注解后面添加(require…

AcWing 788. 逆序对的数量——算法基础课题解

AcWing 788. 逆序对的数量 题目描述 给定一个长度为 n 的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。…

HTML基础知识详解(上)(如何想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习前端基础时&#xff0c;必不可少的就是三大件&#xff08;html、css、javascript &#xff09;&#xff0c;而HTML&#xff08;超文本标记语言——HyperText Markup Language&#xff09;是构成 Web 世界的一砖一瓦&#xff0c;它定义了网页内容的含义和…

一点点金融 5

一点点金融 5 怎么判断是短期回撤&#xff0c;还是趋势反转&#xff1f;市场行为和价格波动背后的深层次原因是什么&#xff1f;1. 成交密度与价格区间2. 投资者心理与市场情绪3. 供需动态4. 价格波动的自我实现性挖掘技术策略的原理分析步骤交易策略实施风险管理 技术分析者怎…

深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望

码到三十五 &#xff1a; 个人主页 在数据库管理系统中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中&#xff0c;查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣&#xff0c;并选择…

获取天翼网关TEWA-708E超级管理员密码

Download RouterPassView 参考&#xff1a;破解光猫超级管理员密码&#xff08;网关型号&#xff1a;TEWA-708E&#xff09; - 知乎

华清远见STM32MP157开发板助力嵌入式大赛ST赛道MPU应用方向项目开发

第七届&#xff08;2024&#xff09;全国大学生嵌入式芯片与系统设计竞赛&#xff08;以下简称“大赛”&#xff09;已经拉开帷幕&#xff0c;大赛的报名热潮正席卷而来。嵌入式大赛截止今年已连续举办了七届&#xff0c;为教育部认可的全国普通高校大学生国家级A类赛事&#x…

复杂度的讲解

1.算法效率 如何衡量一个算法的好坏&#xff1f;从两个维度&#xff0c;时间和空间&#xff08;算法运行的快慢&#xff0c;消耗的空间大不大&#xff09;。因为计算机硬件领域的高速发展&#xff0c;如今计算机的存储量已经达到了一个很高的程度&#xff0c;所以现在我们一般…

MyBatis的xml实现方式

1、该项目引入的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

DotNetBar的SlidePanel和metroTilePanel使用笔记

一、前言 界面组件DotNetBar2中的2个控件属性SlidePanel和metroTitlePanel的使用方法&#xff0c;网上相关资源较少&#xff0c;就一些属性的使用学习记录如下&#xff1a; SlideSideDevComponents.DotNetBar.Controls.eSlideSide.Top/Bottom/Right/Left 及 metroTilePanel和m…

【拓扑空间】示例及详解1

例1 度量空间的任意两球形邻域的交集是若干球形邻域的并集 Proof&#xff1a; 任取空间的两个球形邻域、&#xff0c;令 任取,令 球形领域 例2 规定X的子集族,证明是X上的一个拓扑 Proof&#xff1a; 1. 2., &#xff08;若干个球形邻域的并集都是的元素&#xff0c;元素…

法向量估计

法向量估计 1. 求解点P法向量的原理2. 法向量估计的证明3. 为什么求点P的法向量&#xff0c;需要使用以P为中心的邻域内的点&#xff1f;4. 法向量估计的应用和思考5. 权重法向量估计 1. 求解点P法向量的原理 已知有一组点 P ( p 1 , p 2 , p 3 , . . . , p n ) , p i ∈ R 3…

该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系

该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系 这个去集群主机cm界面上看会出现这个错误 排查思路&#xff1a; 一般比较常见的原因可能是出问题的主机和集群主节点的时间对应不上了。还有就是cm agent服务出现问题了 去该主机的…

阿里 对象存储OSS 云存储服务

1.简介 对象存储服务(Object Storage Service ,OSS) 是一种 海量、安全、低成本、高可靠的云存储服务&#xff0c;适合存放任意类型的文件。容量和处理能力弹性扩展&#xff0c;多种存储类型供选择&#xff0c;全面优化存储成本。 2.如何使用。参考文档 看文档&#xff0c;说的…