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

news2024/12/26 10:52:04

一、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.coloradmin.cn/o/461708.html

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

相关文章

直升机空气动力学基础--004翼型的阻力

来源 1. 空气的粘性 2.阻力的产生 3.形成因素 4.阻力系数曲线

LeetCode-242. 有效的字母异位词

题目链接 LeetCode-242. 有效的字母异位词 题目描述 题解 题解一&#xff08;Java&#xff09; 作者&#xff1a;仲景 首先&#xff0c;满足条件的情况下&#xff0c;两个字符串的长度一定是相等的&#xff0c;不相等一定不满足条件 使用Hash表来存储字符串s中各个字符出现的…

回溯算法——我欲修仙(功法篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️我欲修仙】 系列文章目录 第一章 ❤️ 学习前的必知知识 第二章 ❤️ 二分查找 文章目录 系列文章目录回溯算法&#x1f914;&#x1f914;&#x1f914;回溯算法一般可以解决的问题回溯算法的实现回…

Python语言简介

B站讲解视频&#xff1a;https://www.bilibili.com/video/BV1Mv4y1n7n8/?vd_source515e6808c21c69114a4fae34589dfb0e Python是什么 Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。具有很强的可读性&#xff0c;相比其他语言经常使用英文关键字&a…

为什么有时候磁珠会使电源的纹波变大

电路设计时&#xff0c;我们常常在芯片电源的输入放一个磁珠和电容&#xff0c;用以滤除电源上的高频噪声。 但是有时候会发现&#xff0c;加了磁珠后&#xff0c;芯片电源输入处纹波竟然变大了&#xff0c;超出了电源纹波范围&#xff0c;导致芯片工作异常。 把磁珠换成0R电阻…

论文阅读:Heterogeneous Graph Contrastive Learning for Recommendation(WSDM ’23)

论文链接 Motivation&#xff1a; 在推荐系统中&#xff0c;图神经网络在建模图结构数据上已经变成一个强有力的工具。但是现实生活的推荐语义通常涉及异质关系&#xff08;像用户的社交关系&#xff0c;物品知识关系的依赖&#xff09;&#xff0c;这些都包含丰富的语义信息…

Linux下实现C语言程序

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

从0开始搭建一个简单的前后端分离的XX系统-vue+Springboot+mybatis-plus+mysql

一、准备工作 1.安装node 2.idea 旗舰版** idea**教程 上述教程中的idea**工具 3.安装mysql任意版本 mysql 4.安装mysql workbench&#xff08;没用上&#xff09; 5.安装navicate 参考文章&#xff1a;百度-从小白到架构&#xff08;作者&#xff09;-Navicat16** Nav…

Thinkphp获取项目最近更改变动的所有文件

导读&#xff1a; 企业级的网站项目都是要不断优化迭代更新的&#xff0c;做为一名后端程序员&#xff0c;在编写更新模块时&#xff0c;如何能快速获取最近修改的文件&#xff0c;然后打包压缩成更新补丁呢&#xff1f;我们先来看一下最终效果图&#xff1a; 步骤&#xff1a…

使用FFMPEG分离mp4/flv文件中的264视频和aac音频

准备 ffmpeg 4.4 一个MP4或flv格式的视频文件 分离流程 大致分为以下几个简单步骤&#xff1a; 1.使用avformat_open_input 函数打开文件并初始化结构AVFormatContext 2.查找是否存在音频和视频信息 3.构建一个h264_mp4toannexb比特流的过滤器&#xff0c;用来给视频avpa…

Hudi 数据湖技术之集成Flink

目录 1 安装Flink2 快速入门2.1 集成Flink概述2.2 环境准备2.3 创建表2.4 插入数据2.5 查询数据2.6 更新数据 3 Streaming query3.1 创建表3.2 查询数据3.3 插入数据 4 Flink SQL Writer4.1 Flink SQL集成Kafka4.2 Flink SQL写入Hudi4.2.1 创建Maven Module4.2.2 消费Kafka数据…

【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的迭代器设…

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

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

Android四大组件之广播接收者BroadcastReceiver

一、全局广播 Android中的广播可以分为两种类型&#xff1a;标准广播和有序广播 标准广播&#xff1a;一种完全异步执行的广播&#xff0c;在广播发出之后&#xff0c;所有的广播接收器几乎都会同一时刻接收到这条广播消息&#xff0c;因此它们之间没有任何先后顺序。无法进行…

Vector-常用CAN工具 - 入门到精通 - 专栏链接

一、CANoe篇 1、CANoe入门到精通_软件安装 2、CANoe入门到精通_硬件及环境搭建 3、CANoe入门到精通_软件环境配置 4、CANoe入门到精通_Network Node CAPL开发 5、CANoe入门到精通_Node节点开发基本数据类型 6、CANoe入门到精通_Test Node节点开发设置 7、CANoe入门到精通…

《Cocos Creator游戏实战》AIGC之将草稿内容转为真实内容

目录 前言 训练AI 从识别结果中提取必要数据 发送图片并生成最终代码 总结与提高 资源下载 前言 当创作灵感来的时候&#xff0c;我们可能会先把灵感记录在草稿上&#xff0c;之后再去实现它。比方说有一天&#xff0c;我突然来了游戏创作灵感&#xff0c;想着那可以先把…

gpt 怎么用-免费gpt下载使用方法

gpt 怎么用 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer的神经网络模型&#xff0c;用于自然语言处理任务&#xff0c;例如文本生成、摘要生成、翻译、问答等。以下是使用GPT进行文本生成的一般步骤&#xff1a; 首先&#xff0c;您…

编译预处理

编译预处理 1、宏定义1.1、 无参宏定义1.2、使用宏定义的优点1.3、宏定义注意点1.4、带参数的宏(重点)1.5、条件编译1.6、宏定义的一些巧妙用法(有用)1.7、结构体占用字节数的计算原则&#xff08;考题经常考&#xff0c;要会画图&#xff09;1.8、#在宏定义中的作用&#xff0…

转型产业互联网,新氧能否再造辉煌?

近年来&#xff0c;“颜值经济”推动医美行业快速发展&#xff0c;在利润驱动下&#xff0c;除了专注医美赛道的企业之外&#xff0c;也有不少第三方互联网平台正强势进入医美领域&#xff0c;使以新氧为代表的医美企业面对不小发展压力&#xff0c;同时也展现出强大的发展韧性…

六、CANdelaStudio入门-通信参数编辑

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的通信参数编辑,欢迎各位朋友订阅、评论,…