SpringBoot集成OAuth2.0
文章目录
- OAuth 2.0 介绍
- 概念
- 与传统认证方式的对比
- 常见应用场景
- OAuth 2.0 原理
- 核心角色
- 授权流程
- Spring Boot 集成 OAuth 2.0
- 1. 添加依赖
- 2. 配置 OAuth 2.0 客户端
- 3. 配置 Spring Security
- 4. 创建控制器
- 5. 主应用类
- 代码解释
OAuth 2.0 介绍
概念
OAuth 2.0 是一个开放标准的授权协议,它允许用户授权第三方应用访问其在另一个服务提供商处存储的受保护资源,而无需将自己的用户名和密码直接提供给第三方应用。这极大地增强了用户数据的安全性和隐私性,广泛应用于各种需要第三方授权访问的场景,如社交登录、第三方应用获取用户在云存储服务中的文件等。
与传统认证方式的对比
- 传统认证方式:通常要求用户直接向第三方应用提供其在服务提供商处的用户名和密码,这存在密码泄露的风险。一旦第三方应用的安全性出现问题,用户的账户信息将面临严重威胁。
- OAuth 2.0:用户只需在服务提供商的授权页面上进行授权操作,第三方应用获得的是访问令牌(Access Token),而非用户的原始凭据。即使令牌泄露,攻击者也只能在令牌的有效期和权限范围内访问资源,且令牌可以被服务提供商随时撤销。
常见应用场景
- 社交登录:许多网站和应用允许用户使用社交媒体账号(如微信、QQ、微博、Google、Facebook 等)进行登录。用户无需在新平台上注册新账号,只需授权平台访问其社交账号的基本信息,即可快速完成登录。
- 第三方数据访问:例如,一个健身应用可以请求用户授权访问其在运动追踪服务提供商处的运动数据,以便为用户提供更全面的健身分析和建议。
- API 访问:开发者在开发第三方应用时,需要调用某些服务提供商的 API 来获取数据或执行操作。通过 OAuth 2.0 授权,开发者可以在不暴露用户敏感信息的情况下,合法地使用这些 API。
OAuth 2.0 原理
核心角色
- 资源所有者(Resource Owner):一般是用户,拥有受保护的资源,并有权决定是否授权第三方应用访问这些资源。例如,用户在 Facebook 上的个人信息和照片就是受保护资源,用户可以决定是否允许某个第三方游戏应用访问这些信息。
- 资源服务器(Resource Server):存储受保护资源的服务器。它负责验证访问令牌的有效性,并在验证通过后向第三方应用提供相应的资源。例如,Facebook 的服务器存储了用户的个人信息和照片,当第三方应用携带有效的访问令牌请求这些资源时,Facebook 的服务器会进行验证并返回数据。
- 客户端(Client):即第三方应用,希望访问用户的受保护资源。客户端需要先获得用户的授权,然后使用授权服务器颁发的访问令牌来访问资源服务器上的资源。例如,上述的第三方游戏应用就是客户端。
- 授权服务器(Authorization Server):负责验证资源所有者的身份,处理授权请求,并发放访问令牌。它与资源所有者进行交互,确认用户是否同意授权给客户端,并在用户授权后生成并返回访问令牌。例如,Facebook 的授权服务器会验证用户的身份,显示授权页面,当用户点击“同意”后,生成访问令牌并返回给客户端。
授权流程
OAuth 2.0 定义了四种授权模式,下面详细介绍最常用的授权码模式(Authorization Code Grant):
- 客户端请求授权:客户端引导用户到授权服务器的授权端点,请求用户授权。请求中包含客户端 ID、重定向 URI、请求的权限范围等信息。例如,当用户在第三方游戏应用中选择使用 Facebook 账号登录时,应用会将用户重定向到 Facebook 的授权页面,并携带应用的客户端 ID、指定的重定向 URI 以及请求的权限范围(如获取用户的基本信息、好友列表等)。
- 用户授权:用户在授权服务器的页面上登录并确认是否授权给客户端访问其资源。例如,用户在 Facebook 的授权页面上输入自己的账号密码登录后,会看到一个授权提示,显示第三方应用请求的权限范围,用户可以选择“同意”或“拒绝”。
- 授权服务器返回授权码:如果用户授权,授权服务器将用户重定向回客户端指定的重定向 URI,并附带一个授权码(Authorization Code)。授权码是一个临时的、一次性的代码,用于后续换取访问令牌。例如,用户点击“同意”后,Facebook 的授权服务器会将用户重定向回第三方游戏应用指定的重定向 URI,并在 URL 中附带授权码。
- 客户端换取访问令牌:客户端使用接收到的授权码向授权服务器的令牌端点发送请求,同时提供客户端 ID 和客户端密钥进行身份验证。授权服务器验证通过后,返回访问令牌(Access Token)和可选的刷新令牌(Refresh Token)。例如,第三方游戏应用接收到授权码后,会向 Facebook 的令牌端点发送请求,携带授权码、客户端 ID 和客户端密钥,Facebook 的授权服务器验证这些信息无误后,会返回访问令牌和可能的刷新令牌。
- 客户端访问资源:客户端使用访问令牌向资源服务器发送请求,资源服务器验证令牌的有效性,验证通过后返回受保护的资源。例如,第三方游戏应用使用接收到的访问令牌向 Facebook 的资源服务器请求用户的基本信息,资源服务器验证令牌有效后,会返回用户的姓名、头像等信息。
Spring Boot 集成 OAuth 2.0
1. 添加依赖
在 pom.xml 中添加以下依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency>
</dependencies>
2. 配置 OAuth 2.0 客户端
在 application.yml 中配置 OAuth 2.0 客户端信息,以 GitHub 为例:
spring:security:oauth2:client:registration:github:client-id: your-client-idclient-secret: your-client-secretscope: read:userprovider:github:authorization-uri: https://github.com/login/oauth/authorizetoken-uri: https://github.com/login/oauth/access_tokenuser-info-uri: https://api.github.com/user
将 your-client-id 和 your-client-secret 替换为你在 GitHub 开发者设置中创建的实际客户端 ID 和客户端密钥。
3. 配置 Spring Security
创建一个配置类来配置 Spring Security 以支持 OAuth 2.0 登录:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;@Configuration
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();return http.build();}
}
4. 创建控制器
创建一个简单的控制器来测试 OAuth 2.0 登录后的访问:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HomeController {@GetMapping("/")public String home() {return "Welcome to the protected area! You are authenticated.";}
}
5. 主应用类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootOauth2DemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootOauth2DemoApplication.class, args);}
}
代码解释
- 依赖部分:添加了
spring-boot-starter-web和spring-boot-starter-oauth2-client依赖,为项目提供 Web 服务和 OAuth 2.0 客户端支持。 - 配置文件:在
application.yml中配置了 GitHub 的 OAuth 2.0 客户端信息,包含客户端 ID、客户端密钥、授权 URI、令牌 URI 以及用户信息 URI 等。 - SecurityConfig 类:对 Spring Security 进行配置,要求所有请求都需经过身份验证,并启用 OAuth 2.0 登录。
- HomeController 类:提供一个简单的端点
/,只有经过身份验证的用户才能访问。 - 主应用类:启动 Spring Boot 应用。
按照上述步骤操作,就能在 Spring Boot 项目中集成 OAuth 2.0 认证。启动应用后,访问项目根路径,会自动跳转到 GitHub 的授权页面,授权成功后即可访问受保护的资源。
相关文章:
SpringBoot集成OAuth2.0
文章目录 OAuth 2.0 介绍概念与传统认证方式的对比常见应用场景 OAuth 2.0 原理核心角色授权流程 Spring Boot 集成 OAuth 2.01. 添加依赖2. 配置 OAuth 2.0 客户端3. 配置 Spring Security4. 创建控制器5. 主应用类 代码解释 OAuth 2.0 介绍 概念 OAuth 2.0 是一个开放标准的…...
《继电器:机械骑士的电磁战甲》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:千年契约的青铜誓言 在电气王国的熔炉深处,电磁铁与簧片的盟约已镌刻千年。电磁铁身披螺旋铜线编织的斗篷,其胸膛中沉睡着一道可召唤磁力的古…...
c++中cin.ignore()的作用
在 C 中,cin.ignore() 是用于忽略(丢弃)输入流中的字符的函数,通常用来清除输入缓冲区中的残留内容(如换行符、多余输入等),以避免影响后续的输入操作。 基本用法 cin.ignore(n, delim);n&…...
python如何获取html中附件链接,并下载保存附件
在Python中,要获取HTML中的附件链接并下载保存附件,你通常需要执行以下步骤: 解析HTML内容:使用像BeautifulSoup这样的库来解析HTML并找到包含附件链接的标签(例如<a>标签,它们通常有一个href属性指向…...
【计算机相关学习】R语言
在Python统治数据科学的时代,我意外推开了R语言的大门。这个诞生于统计学家之手的编程语言,像一把精巧的手术刀,改变了我对数据处理的认知边界。 语法里的统计基因令人惊艳。当我第一次用<-符号完成变量赋值时,这个源…...
JavaScript DOM 节点操作
目录 一、DOM 节点 节点类型(Node Types) 二、查找节点 1.查找父节点 1. parentNode 2. parentElement 2.查找子节点 1. childNodes 2. children 3. firstChild / lastChild 4. firstElementChild / lastElementChild 3.查找兄弟节点 1. pre…...
快速求平方根
1. 前置知识 建议首先阅读我的另外一篇文章《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》。建议大家自己看过《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》学会快速求平方根倒数算法后,不看我这篇文章,自己推导一篇快速求平方根的算法&…...
科普:One-Class SVM和SVDD
SVM(支持向量机)算法是用于解决二分类问题的,它在样本空间(高维空间)中找一个最优超平面,使得两类数据点中离超平面最近的点(称为支持向量)到超平面的距离最大。 对于极少数“坏样本…...
Vue 3 中按照某个字段将数组分成多个数组
方法一:使用 reduce 方法 const originalArray [{ id: 1, category: A, name: Item 1 },{ id: 2, category: B, name: Item 2 },{ id: 3, category: A, name: Item 3 },{ id: 4, category: C, name: Item 4 },{ id: 5, category: B, name: Item 5 }, ];const grou…...
冒泡排序笔记
核心思想 通过相邻元素的比较和交换,使较大的元素逐渐“浮”到数组的末尾(像气泡从水底冒到水面一样) 基础冒泡排序 public class BubbleSort{public static void bubbleSort(int[] arr){for(int i 0; i < arr.length - 1; i){//冒泡…...
【ABAP】REST/HTTP技术(一)
1、概念 1.1、SAP 如何提供 Http Service 如果要将 SAP 应用程序服务器 (application server)作为 http 服务提供者,需要定义一个类,这个类必须实现 IF_HTTP_EXTENSION 接口。IF_HTTP_EXTENSION 接口只有一个方法 HANDLE_REQUEST。…...
Flutter PopupMenuButton 深度解析:从入门到架构级实战
在移动应用交互设计中,上下文菜单如同隐形的魔法师,在有限屏幕空间中优雅地扩展操作维度。作为Flutter框架中的核心交互组件,PopupMenuButton绝非简单的菜单触发器,其背后蕴含着Material Design的交互哲学、声明式UI的架构智慧以及…...
C语言基础要素(019):输出ASCII码表
计算机以二进制处理信息,但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’,显然通过键盘输入或屏幕阅读此数据而理解它为字母A,是比较困难的。为了有效的使用信息,先驱者们创建了一种称为ASCII码的交换代…...
VSCode开发者工具快捷键
自动生成浏览器文件.html的快捷方式 在文本里输入: ! enter VSCode常用快捷键列表 代码格式化:Shift Alt F向上或向下移动一行:Alt Up 或者 Alt Down快速复制一行代码:Shift Alt Up 或者 Shift Alt Down快速保…...
CI/CD(九) Jenkins共享库与多分支流水线准备
后端构建 零:安装插件 Pipeline: Stage View(阶段视图)、SSH Pipeline Steps(共享库代码中要调用sshCommond命令) 一、上传共享库 二、Jenkins配置共享库 3、新增静态资源与修改配置 如果是docker和k8s启动…...
使用Deployment运行无状态应用
使用Deployment运行无状态应用 文章目录 使用Deployment运行无状态应用[toc]一、工作负载资源与控制器二、ReplicationController、ReplicaSet和Deployment1. ReplicationController(已淘汰)2. ReplicaSet(ReplicationController 的增强版&am…...
pip安装timm依赖失败
在pycharm终端给虚拟环境安装timm库失败( pip install timm),提示你要访问 https://rustup.rs/ 来下载并安装 Rust 和 Cargo 直接不用管,换一条命令 pip install timm0.6.13 成功安装 简单粗暴...
详解隔离级别(4种),分别用表格展示问题出现的过程及解决办法
选择隔离级别的时候,既需要考虑数据的一致性,避免脏数据,又要考虑系统性能的问题。下面我们通过商品抢购的场景来讲述这4种隔离级别的区别 未提交读(read uncommitted) 未提交读是最低的隔离级别,其含义是…...
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
⼆分答案可以处理⼤部分「最⼤值最⼩」以及「最⼩值最⼤」的问题。如果「解空间」在从⼩到⼤的「变化」过程中,「判断」答案的结果出现「⼆段性」,此时我们就可以「⼆分」这个「解空间」,通过「判断」,找出最优解。 这个「⼆分答案…...
深层储层弹塑性水力裂缝扩展机理
弹性与弹塑性储层条件下裂缝形态对比 参考: The propagation mechanism of elastoplastic hydraulic fracture in deep reservoir | International Journal of Coal Science & Technology...
循环神经网络 - 机器学习任务之异步的序列到序列模式
前面我们学习了机器学习任务之同步的序列到序列模式:循环神经网络 - 机器学习任务之同步的序列到序列模式-CSDN博客 本文我们来学习循环神经网络应用中的第三种模式:异步的序列到序列模式! 一、基本概述: 异步的序列到序列模式…...
什么是检索增强生成(RAG)
1、什么是检索增强生成(RAG) 1.1 检索增强生成的概念 检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了信息检索和文本生成技术的新型自然语言处理方法。这种方法增强了模型的理解和生成能力。 相较于经典生成…...
MATLAB 控制系统设计与仿真 - 33
状态反馈控制系统 -全维状态观测器的实现 状态观测器的建立解决了受控系统不能测量的状态重构问题,使得状态反馈的工程实现成为可能。 考虑到系统的状态方程表达式,如果{A,B}可控,{A,C}可观,且安装系统的性能指标,可…...
PM2 在 Node.js 项目中的使用与部署指南
一、PM2 简介 PM2 是一个带有负载均衡功能的 Node.js 应用程序的进程管理器。它可以让你的 Node.js 应用程序始终保持运行状态,即使出现错误或服务器重启也能自动恢复。同时,它还提供了诸如日志管理、性能监控等实用功能,极大地简化了 Nod…...
企业管理系统的功能架构设计与实现
一、企业管理系统的核心功能模块 企业管理系统作为现代企业的中枢神经系统,涵盖了多个核心功能模块,以确保企业运营的顺畅与高效。这些功能模块通常包括: 人力资源管理模块:负责员工信息的录入、维护、查询及统计分析,…...
RTOS基础 -- NXP M4小核的RPMsg-lite与端点机制回顾
一、RPMsg-lite与端点机制回顾 在RPMsg协议框架中: Endpoint(端点) 是一个逻辑通信端口,由本地地址(local addr)、远程地址(remote addr)和回调函数组成。每个消息都会发送到特定的…...
Cursor的主要好处
以下是Cursor的主要好处: 代码生成与优化 • 快速生成代码:根据简短描述或部分代码片段,Cursor能快速生成完整代码模块,还能智能预测下一步操作,将光标放在合适位置,让开发者一路Tab键顺滑编写代码。 • …...
覆盖学术、职场、生活的专业计算工具
软件介绍 今天要给大家介绍一款超给力的工具软件——CalcKit 计算器。它就像是你口袋里的智能计算专家,轻松化解日常生活中的各类计算难题。无论是简单的数字加减乘除,还是复杂的专业运算,它都不在话下。 这款软件内置了极为强大的计算功能…...
【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇
🔥🔥🔥 上期 《大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器》中我们使用fastapi-mcp自动挂载fastapi到mcp工具,通过源码分析和实践,我们发现每次sse请求又转到了内部fastapi RESTful api接口&…...
嵌入式硬件篇---USBUART串口
文章目录 前言一、UART 通信原理1.发送原理2.接收原理二、单片机UART接收十六进制数的处理方式1.数据解析2.数据存储3.执行相应操作三、USB通信原理四、USB 转串口通信1.硬件连接2.驱动程序3.数据传输过程五、通信特点与应用场景1.USB通信特点与应用场景2.串口通过特点与应用场…...
