Spring Cloud 微服务中搭建 OAuth2.0 认证授权服务

纯硬货,Spring Cloud Gateway整合OAuth2.0 实现分布式统一认证授权 大家好,我是不才陈某~ 今天这篇文章介绍一下Spring Cloud Gateway整合OAuth2.0实现认证授权,涉及到的知识点有点多,有不清楚的可以看下陈某的往期文章。 文章目录如下: 微服务认证方案 微服务认证方案目前有很多种,每个企业也是大不相同,但是总体分为两类,如下: 网关只负责转发请求,认证鉴权交给每个微服务商控制 统一在网关层面认证鉴权,微服务只负责业务 你们公司目前用的是哪种方案? 先来说说第一种方案,有着很大的弊端,如下: 代码耦合严重,每个微服务都要维护一套认 阅读详情

在使用 Spring Cloud 体系来构建微服务的过程中,用户请求是通过网关(ZUUL 或 Spring APIGateway)以 HTTP 协议来传输信息,API 网关将自己注册为 Eureka 服务治理下的应用,同时也从 Eureka 服务中获取所有其他微服务的实例信息。搭建 OAuth2 认证授权服务,并不是给每个微服务调用,而是通过 API 网关进行统一调用来对网关后的微服务做前置过滤,所有的请求都必须先通过 API 网关,API 网关在进行路由转发之前对该请求进行前置校验,实现对微服务系统中的其他的服务接口的安全与权限校验。对于微服务安全认证授权机制一块,目前主流的解决方案有 OAuth2.0 与OIDC(OpenID Connect) 等标准协议。

OAuth2.0 授权模式

OAuth2 是一个开放授权标准协议,它允许用户让第三方应用访问该用户在某服务的特定私有资源,但是不提供账号密码信息给第三方应用。

 
+--------+ +---------------+ | |--(A)- Authorization Request ->| Resource | | | | Owner | | |<-(B)-- Authorization Grant ---| | | | +---------------+ | | | | +---------------+ | |--(C)-- Authorization Grant -->| Authorization | | Client | | Server | | |<-(D)----- Access Token -------| | | | +---------------+ | | | | +---------------+ | |--(E)----- Access Token ------>| Resource | | | | Server | | |<-(F)--- Protected Resource ---| | +--------+ +---------------+ Figure 1: Abstract Protocol Flow 

完整授权流程中有四个重要的角色[ RFC 6749 ]:

  1. 资源拥有者(resource owner):能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户;
  2. 资源服务器(resource server):存储受保护资源,客户端通过access token请求资源,资源服务器响应受保护资源给客户端;
  3. 授权服务器(authorization server):成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。
  4. 客户端(client):第三方应用,也可以是它自己的官方应用;其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来/提交到服务器。

OAuth2.0 协议根据使用不同的适用场景,定义了用于四种授权模式。

Authorization code(授权码模式)

标准的 Server 授权模式,非常适合 Server 端的 Web 应用。一旦资源的拥有者授权访问他们的数据之后,他们将会被重定向到 Web 应用并在 URL 的查询参数中附带一个授权码(code)。在客户端里,该 code 用于请求访问令牌(access_token)。并且该令牌交换的过程是两个服务端之前完成的,防止其他人甚至是资源拥有者本人得到该令牌。另外,在该授权模式下可以通过 refresh_token 来刷新令牌以延长访问授权时间,也是最为复杂的一种方式。

Implicit Grant(隐式模式)

该模式是所有授权模式中最简单的一种,并为运行于浏览器中的脚本应用做了优化。当用户访问该应用时,服务端会立即生成一个新的访问令牌(access_token)并通过URL的#hash段传回客户端。这时,客户端就可以利用JavaScript等将其取出然后请求API接口。该模式不需要授权码(code),当然也不会提供refresh token以获得长期访问的入口。

Resource Owner Password Credentials(密码模式)

自己有一套用户体系,这种模式要求用户提供用户名和密码来交换访问令牌(access_token)。该模式仅用于非常值得信任的用户,例如API提供者本人所写的移动应用。虽然用户也要求提供密码,但并不需要存储在设备上。因为初始验证之后,只需将 OAuth 的令牌记录下来即可。如果用户希望取消授权,因为其真实密码并没有被记录,因此无需修改密码就可以立即取消授权。token本身也只是得到有限的授权,因此相比最传统的 username/password 授权,该模式依然更为安全。

Client Credentials(客户端模式)

没有用户的概念,一种基于 APP 的密钥直接进行授权,因此 APP 的权限非常大。它适合像数据库或存储服务器这种对 API 的访问需求。

备注:理解 OAuth 2.0

OAuth2.0 与 OpenID Connect 开源的框架

JAVA 中开源的认证与授权框架比较知名的有 Apereo CAS,Spring Cloud Security,JBoss 开源的 Keycloak 等(.NET IdentityServer4 )。

Central Authentication Service (CAS) 通常称为 CAS。 CAS是一种针对Web的企业多语言单点登录解决方案,并尝试成为您的身份验证和授权需求的综合平台。

下面是官方的一段简述:

CAS Enterprise Single Sign-On

  • Spring Webflow/Spring Boot Java server component.
  • 可拔插认证支持 (LDAP, Database, X.509, SPNEGO, JAAS, JWT, RADIUS, MongoDb, etc)
  • 多种协议支持 (CAS, SAML, WS-Federation, OAuth2, OpenID, OpenID Connect, REST)
  • 通过各种提供商支持多因素身份验证 (Duo Security, FIDO U2F, YubiKey, Google Authenticator, Microsoft Azure, Authy etc)
  • 支持外部提供者的委托认证,例如: ADFS, Facebook, Twitter, SAML2 IdPs, etc.
  • Built-in support for password management, notifications, terms of use and impersonation.
  • Support for attribute release including user consent.
  • 实时监控和跟踪应用程序行为,统计信息和日志。
  • 用特定的认证策略管理和注册客户端应用程序和服务。
  • 跨平台的客户端支持 (Java, .Net, PHP, Perl, Apache, etc).
  • Integrations with InCommon, Box, Office365, ServiceNow, Salesforce, Workday, WebAdvisor, Drupal, Blackboard, Moodle, Google Apps, etc.

Spring Security OAuth 是建立在 Spring Security 的基础之上 OAuth2.0 协议实现的一个类库,它提供了构建 Authorization Server、Resource Server 和 Client 三种 Spring 应用程序角色所需要的功能。

Keycloak 官方语言来解释,“为现代应用系统和服务提供开源的鉴权和授权访问控制管理”。Keycloak 实现了OpenID,Auth2.0,SAML单点登录协议,同时提供LDAP和Active Directory,以及OpenID Connect, SAML2.0 IdPs,Github,Google 等第三方登录适配功能,能够做到非常简单的开箱即用。

备注:从 4.1 版开始,Spring Boot starter 将基于 Spring Boot 2 adapter。如果您使用的是较旧的 Spring Boot 版本,则可以使用 keycloak-legacy-spring-boot-starter。

Spring Security OAuth2 框架

下面使用 Spring Security OAuth2 为 Spring Cloud 搭建认证授权服务(能够更好的集成到 Spring Cloud 体系中)。

  • ClientDetailsServiceConfigurer:定义客户详细信息服务的配置器。客户端详细信息可以被初始化,或者您可以直接引用一个现有的存储。(client_id ,client_secret,redirect_uri 等配置信息)。
  • AuthorizationServerSecurityConfigurer:用来配置令牌端点的安全约束。
  • AuthorizationServerEndpointsConfigurer:用来配置授权以及令牌的访问端点和令牌服务(比如:配置令牌的签名与存储方式)

Authorization Server

在 Authorization Server 的角色中 Spring Security OAuth2 定义了 AuthorizationServerConfigurerAdapter 配置类

 
public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer { public AuthorizationServerConfigurerAdapter() { } public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { } public void configure(ClientDetailsServiceConfigurer clients) throws Exception { } public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { } } 
  • ClientDetailsServiceConfigurer:用来配置客户端详情信息,一般使用数据库来存储或读取应用配置的详情信息(client_id ,client_secret,redirect_uri 等配置信息)。
  • AuthorizationServerSecurityConfigurer:用来配置令牌端点(Token Endpoint)的安全与权限访问。
  • AuthorizationServerEndpointsConfigurer:用来配置授权以及令牌(Token)的访问端点和令牌服务(比如:配置令牌的签名与存储方式)
  • Resource Server
  • 在 Resource Server 的角色中 Spring Security OAuth2 定义了 ResourceServerConfigurerAdapter 配置类
 
public class ResourceServerConfigurerAdapter implements ResourceServerConfigurer { public ResourceServerConfigurerAdapter() { } public void configure(ResourceServerSecurityConfigurer resources) throws Exception { } public void configure(HttpSecurity http) throws Exception { ((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated(); } } 
 
public class ResourceServerConfigurerAdapter implements ResourceServerConfigurer { public ResourceServerConfigurerAdapter() { } public void configure(ResourceServerSecurityConfigurer resources) throws Exception { } public void configure(HttpSecurity http) throws Exception { ((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated(); } } 
Spring Cloud Gateway整合OAuth2思路分享 通过上面流程的介绍,动手能力很强的小伙伴应该能实现相关的功能了。我正在总结归纳相关的知识点,基于某些原因胖哥现在还没办法给出具体的DEMO,不过这些都会在我的OAuth2专栏进行详细讲解,如果你想掌握这些高精尖的技术,就关注一下我。另外你也可以点击阅读原文直达专栏。先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。... 阅读详情

相关推荐

微服务安全实战:基于Spring Cloud Alibaba与OAuth 2.0构建统一认证授权体系

在分布式微服务架构中,服务间安全认证与授权是保障系统安全的核心挑战。OAuth 2.0作为工业级授权框架,通过标准化流程实现资源访问的委托授权,其核心原理是分离认证与授权职责,引入授权服务器、资源服务器等角色。该技术价值在于实现认证逻辑集中化、资源服务无状态化,有效解决微服务场景下用户身份统一识别与权限管控难题。典型应用场景包括前端应用访问后端多服务、服务间内部调用等。本文以Spring Cloud Alibaba生态为基础,结合JWT(JSON Web Token)与Spring Authorizatio

weixin_30764771的博客 468

【实战】Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权

大家好 今天这篇文章小编介绍一下Spring Cloud Gateway整合OAuth2.0实现认证授权,涉及到的知识点有点多。 文章目录如下: 微服务认证方案 微服务认证方案目前有很多种,每个企业也是大不相同,但是总体分为两类,如下: 网关只负责转发请求,认证鉴权交给每个微服务控制 统一在网关层面认证鉴权,微服务只负责业务 你们公司目前用的哪种方案? 先来说说第一种方案,有着很大的弊端,如下: 代码耦合严重,每个微服务都要维护一套认证鉴权 无法做到统一认证鉴权,开发难度太大 第二种方

superjava_的博客 907

Spring Cloud下基于OAUTH2认证授权的实现

Spring Cloud下基于OAUTH2认证授权的实现

wflovejava的博客 3万+

Spring Cloud2.0之Oauth2环境搭建(授权码模式和密码授权模式)

Spring Cloud2.0之Oauth2环境搭建(授权码模式和密码授权模式) oauth2 server 微服务授权中心, github源码 https://github.com/spring-cloud/spring-cloud-security 对微服务接口做一些权限控制。要给合作伙伴。 通过授权码或者通过密码方式获取accessToken,通过token去获取调用权限。...

art_code的博客 1万+

Spring Cloud实战系列(十) - 单点登录JWT与Spring Security OAuth 2.0

前言 通过 JWT 配合 Spring Security OAuth2 使用的方式,可以避免 每次请求 都 远程调度 认证授权服务。资源服务器 只需要从 授权服务器 验证一次,返回 JWT。返回的 JWT 包含了 用户 的所有信息,包括 权限信息。 正文 1. 什么是JWT JSON Web Token(JWT)是一种开放的标准(RFC 7519),JWT 定义了一种 紧凑 且 自包含 的标准,旨...

陌上轩客 1万+

Spring Cloud OAuth2(基于JWT)的微服务认证授权实战

文章目录1.简介1.1解决方案1.2案例工程架构2.构建auth-server工程2.1添加maven依赖2.2创建数据表2.3 添加配置2.4 自定义UserDetailsService2.5 认证授权配置2.6 扩展token增强器TokenEnhancer2.7 认证授权服务器配置2.8 认证授权服务器测试3.构建auth-client工程3.1 添加maven依赖3.2 重写token解析器3.3 解决Feign接口调用Token传递问题3.4 资源服务器配置4.构建资源服务器应用user-serv

Trazen的专栏 1524

Spring Cloud整合Spring Security Oauth2

OAuth 2.1作为一种开放标准,为微服务架构下的用户身份认证和授权提供了强有力的支持。它允许第三方应用获取用户在特定服务上的有限访问权限,而无需获取用户的用户名和密码。通过OAuth 2.1,企业可以构建安全、灵活的身份认证体系,实现用户身份的统一管理,确保服务间的数据安全和隐私保护。

程序员们必读的博客,涵盖IT技术、编程经验等领域。 1868

Spring Security OAuth2.0认证授权 --- 高级篇

六、OAuth2.0 6.1、OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。 Oauth协议目前发展到2.0版本,1.0版本过

shuai_h的博客 2230

Oauth2.0 实现短信验证码登录过程详解(微服务)

Oauth2.0 简便实现短信验证码登录(微服务) 1.前言 公司新分配了微服务的项目,要求在已有密码登陆的架构上增加手机验证码登陆功能,原有的密码登陆都没摸清的我懵逼了,百度看了很多Spring Security 和 OAuth2基本概念还有一些如何实现短信验证码登录功能的博客,很多文章一上来就给你展示n个类的,或者直接贴上一大堆代码的,对于才了解一点基本概念的我来说属实有点难啃,好在找到了一位大佬将思路以及实现写的很清晰的文章,鉴于大佬的文章图片挺模糊的,我把这几天弄出来的功能简单整理一下,做个记录。

weixin_44699348的博客 6684

spring Cloud微服务 security+oauth2认证授权中心自定义令牌增强,并实现登录和退出_spring security实现微服务用户中心

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 如果你需要这些资料,可以戳这里获取需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! oauth2-

2401_85015477的博客 1019

Spring Cloud Gateway整合OAuth2.0 实现分布式统一认证授权

今天这篇文章介绍一下Spring Cloud Gateway整合OAuth2.0实现认证授权,涉及到的知识点有点多,有不清楚的可以看下陈某的往期文章。 文章目录如下: 微服务认证方案 微服务认证方案目前有很多种,每个企业也是大不相同,但是总体分为两类,如下: 网关只负责转发请求,认证鉴权交给每个微服务商控制 统一在网关层面认证鉴权,微服务只负责业务 你们公司目前用的是哪种方案? 先来说说第一种方案,有着很大的弊端,如下: 代码耦合严重,每个微服务都要维护一套认证鉴权 无法做到统一认证鉴权

BUG指挥课堂 1万+

多智能体强化学习之值函数分解:VDN、QMIX、QTRAN系列优缺点分析(转载)

关于多智能体强化学习中VDN,QMIX,QTRAN三个算法再值分解方向的研究成果。三个算法呈递进关系

qq_33328642的博客 5858

通讯模块_三菱IQ-R PLC串口通讯模块RJ71C24进行Modbus-RTU通讯

在日常的选型中,很多电气工程师咨询我,三菱iQ-R系列有没有Modbus通讯模块,我在这里可以肯定的回复您,这个肯定是有的;我们共有三种可以选择分别是RJ71C24、RJ71C24-R2、RJ71C24-R4。RJ71C24系列支持MC协议通信、通信协议通信、无顺序协议通信、双向协议通信全、MODBUS通信。当我帮助他们选型之后,他们在使用的时候,又是一头雾水。那么今天我抽一些时间讲解一RJ71...

weixin_39878549的博客 9269

ES快速入门,一篇就懂!

Elastic Search 入门前言什么是搜索为什么常用数据库不适合做搜索什么是Lucene什么是Elastic SearchES核心概念ES使用正常启动索引​增删改查ES增加常见问题:ES删除ES查询欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的

qq1592的博客 9310

UE5笔记【十二】蓝图函数BluePrint Function

蓝图函数BluePrint Function。蓝图类。蓝图变量。

xiaoyaolangwj的博客 4393

affymatrix探针转换 | GPL5175探针对应的基因转换

一般情况下,有一些比较成熟的对应平台的注释数据集的R包。但是这个注释平台,我在Bioconductor上找了一圈都没有找到。只能通过最原始也最可靠的方法,从GEO数据集上去下载这部分的注释文件。以下展示全过程。 我要检查的数据平台是:GPL5157。 数据集的注释集链接为:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL5175 这个注释数据集比较难弄的地方在于,它的基因集注释的不太好。没有比较直接的可供提取的genesample的信息;在ge.

weixin_40640700的博客 7124

接口自动化测试如何做?测试老鸟总结,接口测试数据构造大全......

接口参数的数据获取:接口文档:接口文档通常会包含接口需要的请求参数和返回结果的格式、类型等信息;测试用例设计:根据测试用例设计的需求,可以确定需要哪些请求参数以及期望的响应结果;业务数据:从实际业务场景中获取数据,以确保测试数据的真实性和代表性;数据库:从数据库中获取数据,作为接口测试的输入参数;随机数据生成器:通过随机数据生成器生成测试数据,以增加测试用例的多样性和覆盖率。在选择数据来源时,需要根据具体情况进行选择。如果有可靠的接口文档,可以直接从文档中获取请求参数和预期结果;

798

SAP ABAP SM50 的另类用途 - ABAP 工作进程对数据库表读取操作的检测

今天是2020年五一国际劳动节,Jerry祝大家劳动节快乐。 虽然五一国际劳动节来源于一百多年前国外无产阶级的一次大罢工,但由于国情原因,国内很多行业的从业人员,好像天生就是劳碌命。比如程序员行业。 2014年五一劳动节,我在和一个不是总能重现的SAP CRM incident做斗争。详情参考Jerry之前的文章记一次SAP开发工程师给微软Azure报incident的体验. 当时处理完这个复杂...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 8676

Plant Simulation 快速建模与布局(3)——自动生成的对象 代码“安全”删除管理

《PlantSimulation快速布局建模课程》教授利用SimTalk语言实现高效建模的技术要点,包括批量对象创建、阵列布局、属性管理及自动连接功能。重点讲解对象安全删除机制,通过existsObject检查对象存在性后使用deleteObject方法删除,避免程序报错。课程提供完整代码示例,展示如何通过循环结构实现矩阵布局对象的创建与安全删除,确保代码健壮性,显著提升建模效率。

qq_31964455的博客 116

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: spring cloud分布式日志链路跟踪
下一篇: Java:字节流和字符流(输入流和输出流)
javaQQ群 866865133
博客等级 码龄8年 59粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值