Spring Security实战(九)—— 使用Spring Security OAuth实现OAuth对接

news/2024/3/30 0:00:20/文章来源:https://blog.csdn.net/weixin_49561506/article/details/130363376

一、OAuth2.0介绍

        OAuth2.0是一种授权协议,允许用户授权第三方应用程序代表他们获取受保护的资源,如个人信息或照片等。它允许用户授权访问他们存储在另一个服务提供商上的资源,而无需将其凭据共享给第三方应用程序。OAuth2.0协议建立在OAuth1.0协议之上,采用了更简单的流程和更广泛的支持,使得它成为了一种广泛应用的授权协议。

        OAuth2.0协议的核心是授权服务器和资源服务器。授权服务器是一个服务,它允许用户授权第三方应用程序访问他们的资源。资源服务器是存储资源的服务提供商,例如云存储或社交媒体网站。OAuth2.0协议定义了四种授权方式:授权码授权、隐式授权、密码授权和客户端凭证授权。每种授权方式都有不同的用例和安全考虑因素。

        OAuth2.0协议已被广泛采用,例如在社交媒体网站、电子邮件服务、云存储等各种应用程序中,以便为用户提供方便的授权和安全的访问控制。


OAuth2.0定义了四种授权模式,分别是授权码授权、隐式授权、密码授权和客户端凭证授权。

(1)授权码授权(Authorization Code Grant)

这种授权方式是最安全的一种授权方式,适用于需要长时间访问用户受保护资源的客户端。其流程如下:

  • 客户端向授权服务器请求授权,授权服务器将用户重定向到登录页面。
  • 用户输入用户名和密码,登录成功后,授权服务器将授权码发送给客户端。
  • 客户端使用授权码向授权服务器请求访问令牌。
  • 授权服务器验证授权码,并向客户端发放访问令牌和刷新令牌。

(2)隐式授权(Implicit Grant)

这种授权方式适用于一些需要短时间内访问用户受保护资源的客户端。其流程如下:

  • 客户端向授权服务器请求授权,授权服务器将用户重定向到登录页面。
  • 用户输入用户名和密码,登录成功后,授权服务器将访问令牌直接发送给客户端。

(3)密码授权(Resource Owner Password Credentials Grant)

这种授权方式适用于用户与客户端之间有一定信任关系,且客户端可以安全存储用户凭证。其流程如下:

  • 客户端使用用户凭证向授权服务器请求访问令牌。
  • 授权服务器验证用户凭证,并向客户端发放访问令牌和刷新令牌。

(4)客户端凭证授权(Client Credentials Grant)

这种授权方式适用于客户端需要访问自己拥有的资源的情况。其流程如下:

  • 客户端使用自己的凭证向授权服务器请求访问令牌。
  • 授权服务器验证客户端凭证,并向客户端发放访问令牌。

这四种授权方式各有优缺点,在选择授权方式时需要根据实际情况进行选择。

二、Spring Security OAuth介绍

        Spring Security OAuth是Spring Security框架的扩展,提供了对OAuth身份验证和授权的支持。OAuth是一个开放标准的授权协议,允许用户授权第三方应用程序访问其资源,而无需共享其凭据(用户名和密码)。

        Spring Security OAuth是一个专注于OAuth认证的框架,它完整覆盖了客户端、资源服务和认证服务三个模块。

  • 客户端模块提供了OAuth客户端的实现,可以与OAuth认证服务器进行交互,以获取访问令牌。
  • 资源服务模块提供了保护受OAuth保护的资源的功能,它可以验证请求中的访问令牌,并检查访问令牌的有效性和权限。
  • 认证服务模块提供了OAuth认证服务器的实现,可以处理OAuth认证请求,并向客户端提供访问令牌。

Spring Security中集成了OAuth的客户端模块,它包含三个子模块,分别是:

  1. spring-security-oauth2-core:该子模块包含OAuth2的核心功能,包括OAuth2的授权和令牌请求流程等。

  2. spring-security-oauth2-client:该子模块提供了OAuth2客户端的实现,可以与OAuth2认证服务器进行交互,以获取访问令牌。

  3. spring-security-oauth2-jose:该子模块提供了JSON Web令牌(JWT)的支持,可以使用JWT作为OAuth2访问令牌的替代方案。

二、使用Spring Security OAuth实现GitHub快捷登录

(1)新建工程

新建Spring Boot2.0 工程 ,pom包依赖如下:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-jose</artifactId></dependency></dependencies>

(2)注册OAuth应用

在GitHub官网上注册一个新的OAuth应用,地址是:New OAuth Application (github.com)

 

 点击 Register application按钮,即可注册得到clientId 和clientSecret

        当用户通过浏览器成功登录Github,并且用户在批准页授权允许注册的客户局端访问自己的用户数据后,GitHub会将授权码Code通过重定向的方式传递给客户端应用。 

         Spring Security OAuth默认的重定向模板是 {baseUrl}/login/oauth2/code/{registrationId},registrationId是ClientRegistration的唯一ID,通常以接入的OAuth服务提供商的简称来命名即可,所以此处设置为github。

(3)配置application.yml

在配置文件中增加相应的配置,client-id和client-secret就是刚才在github上获取的。

 (4)新建Controller

参数中的principal对象由Spring框架自动注入,表示当前登录的用户

@RestController
public class SimpleController {@GetMapping("/hello")public String hello(Principal principal) {String username = (String) ((OAuth2AuthenticationToken) principal).getPrincipal().getAttributes().get("login");return "hello, " + username;}
}

(5)效果演示 

启动新建的OAuth工程,访问:http://localhost:8080/hello

 

单击Authorize zy19970116 按钮,以允许OAuth客户端应用访问GitHub的用户数据,此时OAuth客户端应用会调用用户数据接口,创建认证对象。浏览器最终将自动重定向到原访问地址:http://localhost:8080/hello, 并打印字符串 ”hello ,XXX“ 

总结:

        GitHub代表的是OAuth服务提供商的角色,它提供了OAuth 2.0授权流程的实现,允许第三方应用程序使用OAuth 2.0协议与GitHub进行通信,从而获取用户的授权信息和资源。 

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

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

相关文章

【具体到每一步】从0制作一个uniapp的新闻类页面(界面篇)

目录 项目初始化 / 基础配置 项目创建 配置路由/页面/tabbar pages.json配置tabbar 配置图标/静态资源 导航栏和字体颜色 scroll-view实现横向滚动条样式 公共模块定义components组件 新建组件 使用组件 组件里的结构 布局个人中心页面 组件差异化处理 数据传递 导航…

DevExpress:报表在winform窗体上显示(使用documentViewer控件)

一&#xff1a;控件认识 documentViewer&#xff08;版本DX22.2&#xff09;,老版本中的可能是printControl&#xff08;工具箱面板中可能找不到&#xff09;&#xff0c;通过官网搜索发现&#xff0c;这个控件现在继承于documentViewer这个控件。因此&#xff0c;使用documen…

Unity入门(一)

Unity Unity是一套完善体系与编辑器的跨平台游戏开发工具&#xff0c;也可以称之为游戏引擎。游戏引擎是指一些编写好的可以重复利用的代码与开发游戏所用的各功能编辑器。 基于C#编程&#xff0c;易上手&#xff0c;高安全性独特的面向组件游戏开发思想让游戏开发更加简单易…

【神经网络】tensorflow实验7--回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法 ②掌握多元线性回归模型的实现方法 ③掌握三维数据可视化方法 2. 实验内容 ①使用TensorFlow建立一元线性回归模型&#xff0c;使用商品房销售数据训练模型&#xff0c;并使用训练好的模型预测房价 ②使用TensorFlow建立多元线…

十、ElasticSearch 实战 - 源码运行

一、概述 想深入理解 Elasticsearch&#xff0c;了解其报错机制&#xff0c;并有针对性的调整参数&#xff0c;阅读其源码是很有必要的。此外&#xff0c;了解优秀开源项目的代码架构&#xff0c;能够提高个人的代码架构能力 阅读 Elasticsearch 源码的第一步是搭建调试环境&…

思维导图从入门到大神

思维导图怎么做&#xff1f;思维导图是一种发散性思维的图。在我们生活的方方面面都有运用。无论是工作、学习、还是生活&#xff0c;我们都可以用到它。那思维导图是怎么绘制的呢&#xff1f;其实非常简单&#xff0c;只要这简单的几步 1、首先在绘制思维导图前&#xff0c;我…

【网络】-- UDP协议

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号&#xff08;Well-Know Port Number&#xff09; 两个问题 netstat pidof UDP协议 UDP的特点 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 传输层 负责数据能够从发送端传输接收端。 再谈端口号 端…

Codeforces Round 861 (Div. 2)(A~D)

A. Lucky Numbers 给出边界l和r&#xff0c;在区间[l, r]之间找到幸运值最大的数字。一个数字的幸运值被定义为数位差的最大值&#xff0c;即数字中最大的数位和最小的数位的差。 思路&#xff1a;因为涉及到至少两位&#xff0c;即个位和十位变化最快&#xff0c;最容易得到相…

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 进程创建回顾2. 再论进程创建2.1 思考2.2 vfork()深度分析2.3 vfork()要点分析2.4 fork()的现代优化2.5 编程实验&#xff1a;fork() &…

被遗忘的Java关键字:transient

前言 今天在看项目代码时候&#xff0c;看到了下面这样一行代码&#xff0c;用transient修饰了一个变量&#xff0c;主要作用是做一个全局开关。说实话我是第一次看到这个关键字。激发了我的好奇心&#xff0c;所以就了解一下这是何方神圣。 /*** 全局开关*/public static tran…

最新研究:可审计的具有拜占庭鲁棒的联邦学习方案

本人新论文&#xff0c;可免费下载&#xff1a;https://download.csdn.net/download/liangyihuai/87727720 Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.…

浅谈拉格朗日插值法

浅谈拉格朗日插值法 好像FFT要用到&#xff0c;所以就学习一手 文章目录 浅谈拉格朗日插值法什么是插值拉格朗日插值法 什么是插值 在离散数据的基础上补插连续的函数&#xff0c;使得这条连续函数经过所有离散数据点&#xff0c;这个过程就叫插值。其意义在于&#xff1a; …

论文阅读:DLME = Deep Local-flatness Manifold Embedding

Author: Zelin Zang, Siyuan Li, Di Wu and Stan Z Li. 1-4: Westlake University 摘要 流形学习&#xff08;ML, Manifold learning&#xff09;旨在从高维数据中识别低维结构和嵌入&#xff0c;然而我们发现现有工作在采样不足的现实数据集上效果不佳。一般的ML方法对数据结…

LNMP网站框架搭建

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程&#xff1a; 1.客户端通过域名进行请求访问时&#xff0c;会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断&#xff0c;如果是静态请求,Nginx会自行处理&#xff0c;并将处理结果返…

【C++】了解设计模式、 stackqueue的使用与模拟实现

文章目录 1.设计模式2.stack1.stack的使用1.stack的结构2.stack的接口 2.stack的模拟实现1.stack的结构2.接口实现 3.queue1.queue的使用1.queue的结构3.queue的接口 2.queue的模拟实现1.queue的结构2.接口实现 4.了解deque1.deque的原理介绍2.deque的底层结构3.deque的迭代器设…

【Android入门到项目实战-- 7.1】—— 如何使用通知?

目录 一、创建通知的步骤 1、创建一个NotificationManager实例 2、使用一个Builder构造器来创建Notification对象 3、设置标题、文字、时间和图标等信息 4、显示通知 二、通知实例演示 三、实现通知的点击效果 1、PendingIntent 什么是PendingIntent&#xff1f; 如何使…

Linux下实现C语言程序

一.情况说明 写这篇博客的情况比较复杂&#xff0c;首先我本来是参加新星计划按照规划现在去学习shell脚本语言的&#xff0c;但是博主现在由于其他原因需要了解makefile&#xff0c;makefile是Linux系统下的一种工具&#xff0c;makefile的一些背景要涉及链接库的知识&#xf…

HTB-DevOops

HTB-DevOops 信息收集5000端口 立足python反序列化攻击XEE读取SSH root 信息收集 5000端口 根据文字所述&#xff0c;下面的图片是feed.py。 目录扫描 /upload如下&#xff1a; 上传测试xml文件。 得到反馈 怀疑是标签不匹配&#xff0c;尝试寻找匹配的标签。前面首页有提…

【算法】【算法杂谈】判断点是否在三角形内部(面积法和向量法)

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…

Java企业电子招标采购系统源码Spring Boot + Mybatis + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…