spring security oauth2.0的四种模式

OAuth 2.0 定义了 4 种授权模式(Grant Type),用于不同场景下的令牌获取。以下是每种模式的详细说明、适用场景和对比:


一、授权码模式(Authorization Code Grant)

适用场景

Web 应用(有后端服务器)
移动端应用(需安全存储 client_secret
• 最安全的模式,推荐公开客户端使用

流程
用户 客户端 授权服务器 资源服务器 访问客户端 重定向到授权服务器 登录并授权 重定向回客户端(携带授权码 code) 传递 code 用 code 换取令牌(client_id + client_secret) 返回访问令牌(access_token)和刷新令牌(refresh_token) 用 access_token 访问资源 用户 客户端 授权服务器 资源服务器
特点

• 令牌不暴露给浏览器(通过后端交换)
• 支持 refresh_token
• 需预注册 redirect_uri 防止钓鱼攻击


二、隐式模式(Implicit Grant)

适用场景

单页应用(SPA) 或纯前端应用
无后端服务器的场景
已被 OAuth 2.1 废弃(建议用授权码模式 + PKCE 替代)

流程
用户 客户端 授权服务器 资源服务器 访问客户端 重定向到授权服务器 登录并授权 重定向回客户端(URL 片段携带 access_token) 前端提取 access_token 用 access_token 访问资源 用户 客户端 授权服务器 资源服务器
特点

• 直接返回 access_token(无中间授权码)
• 令牌通过 URL 片段传递(前端可见,存在泄露风险)
• 不支持 refresh_token


三、密码模式(Resource Owner Password Credentials Grant)

适用场景

受信任的客户端(如公司内部系统)
• 用户需直接在客户端输入用户名/密码
高风险,仅限无法使用其他模式的场景

流程
用户 客户端 授权服务器 资源服务器 输入用户名和密码 发送用户名、密码、client_id、client_secret 返回 access_token 和 refresh_token 用 access_token 访问资源 用户 客户端 授权服务器 资源服务器
特点

• 用户需向客户端暴露密码(违反最小权限原则)
• 仅适用于高信任度环境(如内部系统)
• 支持 refresh_token


四、客户端凭证模式(Client Credentials Grant)

适用场景

服务器到服务器的通信(无用户参与)
• 机器对机器(M2M)认证
• 访问与用户无关的公共资源

流程
客户端 授权服务器 资源服务器 发送 client_id 和 client_secret 返回 access_token 用 access_token 访问资源 客户端 授权服务器 资源服务器
特点

• 无用户参与
• 令牌权限范围由客户端注册时决定
• 不支持 refresh_token


五、模式对比与选型指南

模式安全性适用客户端类型是否需要用户参与令牌存储位置
授权码模式⭐⭐⭐⭐⭐Web 应用、移动端(有后端)后端安全存储
隐式模式⭐⭐SPA(已过时)前端存储(高风险)
密码模式受信任的内部系统后端存储
客户端凭证模式⭐⭐⭐⭐服务器到服务器后端安全存储

六、最佳实践

  1. 优先使用授权码模式(尤其是公开客户端)
  2. 避免隐式模式(OAuth 2.1 已废弃,改用 PKCE 增强的授权码模式)
  3. 密码模式仅限高信任环境(如公司内部工具)
  4. 客户端凭证模式用于 M2M 场景(如定时任务、API 网关)
  5. 强制 HTTPS 防止令牌泄露

七、Spring Security 中实现示例

授权码模式配置(Google 登录):
# application.yml
spring:security:oauth2:client:registration:google:client-id: your-client-idclient-secret: your-client-secretauthorization-grant-type: authorization_coderedirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
客户端凭证模式配置:
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,OAuth2AuthorizedClientRepository authorizedClientRepository) {OAuth2ClientCredentialsGrantRequestEntityConverter converter = new OAuth2ClientCredentialsGrantRequestEntityConverter();DefaultClientCredentialsTokenResponseClient client = new DefaultClientCredentialsTokenResponseClient();client.setRequestEntityConverter(converter);AuthorizedClientServiceOAuth2AuthorizedClientManager manager = new AuthorizedClientServiceOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);manager.setAuthorizedClientProvider(new ClientCredentialsOAuth2AuthorizedClientProvider());return manager;
}

通过理解这四种授权模式,您可以根据具体场景选择最合适的认证流程,平衡安全性与用户体验。

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

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

相关文章

Oracle 排除交集数据 MINUS

MINUS 是 Oracle 数据库中的一种集合操作符,用于返回第一个查询结果中存在但第二个查询结果中 不存在 的 唯一行。其核心功能是 排除交集数据,常用于数据差异分析或过滤特定记录 一、核心功能 排除交集:返回第一个查询结果中 不在第二个查询结…

WiFi那些事儿(四)

目录 一、IEEE 802.11ah标准简介 二、IEEE 802.11ah信道特点 三、IEEE 802.11ah传输模式 在WiFi通信领域,信号绕射能力一直是一个关键问题。常规的WiFi设备多工作在2.4GHz和5GHz频段,这些频段的电磁波波长通常小于障碍物尺寸,受电磁波本身…

C++在Linux上生成动态库并调用接口测试

加减乘除demo代码 项目结构 CPP/ ├── calculator.cpp ├── calculator.h ├── main.cpp 头文件 #ifndef CALCULATOR_H #define CALCULATOR_H#ifdef __cplusplus extern "C" {#endifdouble add(double a, double b);double subtract(double a, double b…

离线密码生成器:安全可靠的密码管理解决方案

离线密码生成器:安全可靠的密码管理解决方案 在当今数字时代,我们每天都需要使用各种网站和应用程序,每个账户都需要一个强密码来保护我们的个人信息和隐私。然而,记住多个复杂的密码几乎是不可能的任务。今天,我要向…

ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 论文理解和翻译

一、TL;DR MLLM在感知方面存在不足(远远比不上专家模型),比如Qwen2-VL在coco上recall只有43.9%提出了ChatRex,旨在从模型设计和数据开发两个角度来填补这一感知能力的缺口ChatRex通过proposal边界框输入到LLM中将其转…

自动驾驶技术-相机_IMU时空标定

自动驾驶技术-相机_IMU时空标定 时间延迟 时间延迟 参考链接1、2 相机主要分为全局和卷帘快门相机,从触发到成像的过程包括:复位时间、AE()曝光时间、读出时间 全局快门如下图所示 卷帘快门如下图所示 相机录制视频时,为了保持固定频率&am…

Vue3 + Vite + TS,使用 Web Worker,web worker进阶 hooks

worker 具体通讯方式 1.由 web page 发送消息- worker.postMessage(发送数据) 2.web worker 接收消息并执行相关逻辑- onmessage (e) > { 接收数据并处理逻辑postMessage(传递处理后的数据)} 3.由 web page 监听 worker 消息,包括:- 处理数据的监听…

AIDD-人工智能药物设计-AI 精准预测蛋白质变构位点

Allo-PED: AI 精准预测蛋白质变构位点 目录 Allo-PED 框架融合蛋白质语言模型与结构特征,显著提高了变构位点预测的准确性和泛化能力。EcoFoldDB 利用蛋白质结构信息,为宏基因组提供了精确且可扩展的生态功能注释新方法,显著提升了对未知微生物功能的认知。上下文分子适配(…

1558 找素数

1558 找素数 ⭐️难度:中等 🌟考点:质数 📖 📚 import java.util.Scanner; import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.…

Nacos 提供了哪些服务的保护机制?

当面试官问这个问题时,大家一定要保持头脑清醒,不要被带跑偏了,Nacos 本身的核心定位是服务发现和配置管理中心,它并不直接提供像服务熔断、服务限流、服务降级、请求重试 这类完整的、开箱即用的客户端/网关级服务保护&#xff0…

【家政平台开发(38)】解锁家政平台国际化密码:多语言支持开发实战

> 本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质…

DirectX12 - 基本知识 - 图形驱动的本质

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互…

selenium元素获取

from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome()driver.maximize_window()#最大化窗口 #隐式等待 driver.implicitly_wait(10)#打开网页 driver.get("https://www.zhipin.com/beijing/?kacity-sites-101010100&q…

生物化学笔记:医学免疫学原理15 超敏反应过敏反应(I型[蚊虫叮咬]+II型[新生儿溶血症、突眼型甲亢]+III型+IV型)

超敏反应 每个人都可能发生的过敏问题:被蚊子咬后起包 I型超敏反应 II型超敏反应 新生儿溶血症分为Rh血型不合和ABO血型不合两种情况。Rh血型不合通常从第二胎开始更容易发病,因为母体初次接触Rh阳性胎儿的红细胞后会产生抗D抗体,而这个致敏…

【android bluetooth 框架分析 02】【Module详解 2】【gd_shim_module 模块介绍】

1. 背景 上一章节 我们介绍了 module_t 的 大体框架 ,本节内容我们就选择 我们的 gd_shim_module 模块为例子,具体剖析一下,它里面的逻辑。 static const char GD_SHIM_MODULE[] "gd_shim_module";// system/main/shim/shim.cc …

【包管理器】主流包管理器_对比_应用场景

不定期更新,建议关注收藏点赞。 链接: npm专题 目录 主流包管理器简介对比 主流包管理器简介 主流的包管理器其实有不少,不同语言和平台都有各自的一套系统。 前端(JavaScript/TypeScript) 名称简介开发者特点npmNo…

参照Spring Boot后端框架实现序列化工具类

本文参照Jackson实现序列化工具类,旨在于简化开发 JacksonUtil.class public class JacksonUtil {private JacksonUtil() {}/*** 单例*/private final static ObjectMapper OBJECT_MAPPER;static {OBJECT_MAPPER new ObjectMapper();}private static ObjectMappe…

Rust入门之迭代器(Iterators)

Rust入门之迭代器(Iterators) 本文已同步本人博客网站 本文相关源码已上传Github 前言 迭代器(Iterators)是 Rust 中最核心的工具之一,它不仅是遍历集合的抽象,更是 Rust 零成本抽象(Zero-Co…

若依框架二次开发——RuoYi-AI 本地部署流程

文章目录 项目环境安装后端1. 下载项目2. 使用 IDEA 导入项目3. 配置 Maven4. 配置 Maven settings.xml5. 初始化数据库6. 启动 Redis7. 修改数据库配置8. 启动后端服务安装管理端1. 下载管理端项目2. 安装依赖3. 启动管理端4. 修改管理端配置安装用户端1. 下载用户端项目2. 安…

精品推荐-最新大模型MCP核心架构及最佳实践资料合集(18份).zip

精品推荐-最新大模型MCP核心架构及最佳实践资料合集,共18份。 1、2025年程序员必学技能:大模型MCP核心技术.pdf 2、MCP 架构设计剖析:从 Service Mesh 演进到 Agentic Mesh.pdf 3、MCP 架构设计深度剖析:使用 Spring AI MCP 四步…