获取GitHub的OAuth2的ClientId和ClientSecrets
获取 GitHub OAuth2 登录所需的 client-id 和 client-secret
- 登录 GitHub:使用你的 GitHub 账号登录到 GitHub。
- 访问开发者设置:点击右上角的头像,选择
Settings,然后在左侧导航栏中选择Developer settings。 - 创建新的 OAuth 应用:在 Developer settings 中,选择 OAuth Apps,然后点击
New OAuth App。 - 填写应用信息:
Application name:为你的应用取一个名称。
Homepage URL:应用的主页 URL。
Authorization callback URL:用户授权后重定向的 URL。这个 URL 必须是你应用中能够处理授权回调的有效 URL。 - 注册应用:填写完信息后,点击
Register application。 - 获取 client-id 和 client-secret:注册成功后,你会看到应用的 Client ID 和 Client Secret。注意,Client Secret 只会显示一次,务必妥善保存。
在 Spring Boot 中配置 OAuth2:
- 在 pom.xml 中引入如下依赖
<!-- 能够让用户避免在Web站点特定的登录页上自己输入凭证信息。这样的Web站点提供了一种通过其他网站(如Facebook)登录的方式,用户可能已经在这些其他的网站登录过了。这种类型的认证是基于OAuth2或OpenID Connect(OIDC)的。OAuth2是一个授权规范,例如使用它来保护REST API,但它也可以用来通过第三方网站实现认证功能。OpenID Connect是另一个基于OAuth2的安全规范,用于规范化第三方认证过程中发生的交互。 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency>
- 在application.properties中添加如下配置
# Spring Security内置了针对Facebook、Google、GitHub和Okta的登录方式,但你也可以通过指定一些额外的属性来配置其他客户端。
# 要让我们的应用成为OAuth2或OpenID Connect的客户端,有一些通用的属性需要设置,如下所示:
# 客户端ID和secret是用来标识我们的应用在Facebook中的凭证。你可以在Facebook的开发者网站新建应用来获取客户端ID和secret。scope属性可以用来指定应用的权限范围。
# 所有工作:1.引入oauth2依赖 2.配置客户端id和secret以及scope,这就是所有工作,当访问需要认证的页面时,会自动跳转到facebook登录页面
# 如果通过声明SecurityFilterChain bean来自定义安全配置,那么除了其他的安全配置,还需要启用OAuth2登录。
spring.security.oauth2.client.registration.github.client-id=<client id>
spring.security.oauth2.client.registration.github.client-secret=<client secret>
spring.security.oauth2.client.registration.github.scope=<scope>
在SecurityConfig配置类中通过SecurityFilterChain配置HttpSecurity启用OAuth2
@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {/** HttpSecurity可以配置很多的功能,其中包括:●要求在为某个请求提供服务之前,满足特定的安全条件;●配置自定义的登录页;●使用户能够退出应用;●预防跨站请求伪造。* HttpSecurity最常见的需求就是拦截请求以确保用户具备适当的权限。* */return http.authorizeRequests().antMatchers("/design", "/orders").hasRole("USER")
// .antMatchers("/design", "/orders").access("hasRole('USER') or hasRole('ADMIN')").antMatchers("/", "/**").permitAll()// 为了替换内置的登录页,我们首先需要告诉Spring Security自定义登录页的路径。这可以通过调用HttpSecurity对象的formLogin()方法来实现,如下所示:.and().formLogin().loginPage("/login")
// // 声明Spring Security要监听对“/authenticate”的请求来处理登录信息的提交。同时,用户名和密码的字段名应该是user和pwd。
// .loginProcessingUrl("/authenticate").usernameParameter("user").passwordParameter("pwd")
// // 如果用户登录成功,就会被重定向到“/design”路径。
// .defaultSuccessUrl("/design", true)// 如果通过声明SecurityFilterChain bean来自定义安全配置,那么除了其他的安全配置,还需要启用OAuth2登录,如下所示:.and().oauth2Login().and().build();/* 表5.1 用来定义如何保护路径的配置方法
| 方法 | 功能 |
| -------------------------- | ------------------------------------------------------------ |
| access(String) | 如果给定的SpEL(代表Spring ExpressionLanguage)表达式计算结果为true,就允许访问 |
| anonymous() | 允许匿名用户访问 |
| authenticated() | 允许认证过的用户访问 |
| denyAll() | 无条件拒绝所有访问 |
| fullyAuthenticated() | 如果用户进行了完整认证(而不是通过Rememberme功能认证的),就允许访问 |
| hasAnyAuthority(String...) | 如果用户具备给定权限中的某一个,就允许访问 |
| hasAnyRole(String...) | 如果用户具备给定角色中的某一个,就允许访问 |
| hasAuthority(String) | 如果用户具备给定权限,就允许访问 |
| hasIpAddress(String) | 如果请求来自给定IP,就允许访问 |
| hasRole(String) | 如果用户具备给定角色,就允许访问 |
| not() | 对其他访问方法的结果求反 |
| permitAll() | 无条件允许访问 |
| rememberMe() | 如果用户是通过Remember-me功能认证的,就允许访问 |* 我们还可以使用access()方法,通过为其提供SpEL表达式来声明更丰富的安全规则。Spring Security扩展了SpEL,包含多个安全相关的值和函数,如表5.2所示。* 表5.2 Spring Security对Spring表达式语言的扩展
| 安全表达式 | 计算结果 |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| authentication | 用户的认证对象 |
| denyAll | 结果始终为false |
| hasAnyAuthority(String...authorities) | 如果用户被授予了给定权限中的任意一个,结果为true |
| hasAnyRole(String.. roles) | 如果用户具有给定角色中的任意一个,结果为true |
| hasAuthority(String authority) | 如果用户被授予了给定的权限,结果为true |
| hasPermission(Object target, Object permission) | 如果用户能够访问特定目标对象以获取给定权限,结果为true |
| hasPermission(Serializable targetId String targetType,Objeotpermission) | 如果用户能够访问targetId和targetType中给定的象以获取给定权限,结果为true |
| hasRole(String role) | 如果用户被授予了给定的角色,结果为true |
| hasIpAddress(String ipAddress) | 如果请求来自给定IP,结果为true |
| isAnonymous() | 如果用户为匿名用户,结果为true |
| isAuthenticated() | 如果用户进行了认证,结果为true |
| isFullyAuthenticated() | 如果用户进行了完整认证(而不是通过Renember-me功能认证的),结果为true |
| isRememberMe() | 如果用户是通过Renemberme功能认证的,结果为true |
| permitAll | 结果始终为true |
| principal | 用户的principal对象
*/}
相关文章:
获取GitHub的OAuth2的ClientId和ClientSecrets
获取 GitHub OAuth2 登录所需的 client-id 和 client-secret 登录 GitHub:使用你的 GitHub 账号登录到 GitHub。访问开发者设置:点击右上角的头像,选择 Settings,然后在左侧导航栏中选择 Developer settings。创建新的 OAuth 应用…...
self-attention部分代码注释
多头注意力机制(Multi-Head Attention, MHA),是 Transformer 模型的核心组件之一。以下是对代码的逐行解析和详细说明: attention-is-all-you-need-pytorch-master\transformer\SubLayers.py class MultiHeadAttention(nn.Mo…...
idea里的插件spring boot helper 如何使用,有哪些强大的功能,该如何去习惯性的运用这些功能
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
常用的配置文件格式对比(ini,toml,yaml,json,env,settings.py)及应用程序修改自身配置并保留注释
代码与环境配置解耦 git分支的代码应做到“环境无关”:代码本身不硬编码任何环境特定的配置(如数据库连接、密钥、API地址),而是通过外部机制动态注入。 配置与代码分离:将配置信息存储在代码库之外(如环…...
Java IO 和 NIO 的基本概念和 API
一、 Java IO (Blocking IO) 基本概念: Java IO 是 Java 平台提供的用于进行输入和输出操作的 API。Java IO 基于 流 (Stream) 的模型,数据像水流一样从一个地方流向另一个地方。Java IO 主要是 阻塞式 I/O (Blocking I/O),即线程在执行 I/O …...
小智AI桌宠机器狗
本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...
MySQL 入门“鸡”础
一、Win10 与Ubuntu安装 以下是一篇针对 Ubuntu 安装 MySQL 的过程中写的示例: --- # Ubuntu 安装 MySQL 详细指南 在本教程中,我们将向您展示如何在 Ubuntu 上安装 MySQL,并完成基本的安全配置。以下是具体步骤: # 1. 安装 …...
Redis 中有序集合(Sorted Set)的使用方法
文章目录 前言1. 有序集合的特点2. 常用命令2.1 添加元素(ZADD)2.2 获取元素分数(ZSCORE)2.3 获取元素排名(ZRANK / ZREVRANK)2.4 获取范围内的元素(ZRANGE / ZREVRANGE)2.5 获取分数…...
WIn32 笔记:本专栏课件
专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:无 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始,我们进入预备章。 本节内容,属于是 …...
Unity git 获取当前修改或者新增的文件列表
直接上代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text.RegularExpressions; using UnityEngine;public class GitFileStatusCheckerTools : MonoBehaviour {// 获取Git变更文件列表(新增/修…...
结构型模式 - 桥接模式 (Bridge)
结构型模式 - 桥接模式 (Bridge) 桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。 // 软件接口,作为实现部分 interface Software {void run(); }// 游戏软件类,实现 Software 接口 class Game…...
如何让传统制造企业从0到1实现数字化突破?
随着全球制造业不断向智能化、数字化转型,传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新,更是管理、文化、业务流程等全方位的变革。从零开始,如何带领一家传统制造企业走向数字化突破,是许多企业领导者面…...
【Elasticsearch】script_fields 和 runtime_fields的区别
script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能,但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比: 1.定义和应用场景 • script_fields: • 定义:通过 Painless 脚本…...
城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章
当艺术与科技相遇,会碰撞出怎样的火花?城电科技推出的光伏太阳花,以其独特的设计与智能化的功能,给出了答案。这款产品不仅具备太阳能发电的实用功能,更是一件充满科技属性的艺术性光伏产品,吸引了广泛关注…...
【笔记ing】C语言补充、组成原理数据表示与汇编实战、操作系统文件实战(高级阶段)
【第19节 C语言语法进阶】 【19.1 条件运算符与逗号运算符】 1 条件运算符 条件运算符是C语言中唯一的一种三亩运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑运算符就是双目运算符;弹幕运算符代表有一个操作数&a…...
快节奏生活
在当今快节奏的商务环境中,效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台,以其独特的功能和优势,为职场人士带来了前所未有的便捷与高效,成为了众多用户心中的“宝藏”工具。 1、亿可达:自动化流程的搭…...
【音视频】音视频录制、播放原理
一、音视频录制原理 通常,音视频录制的步骤如下图所示: 我们分别从音频和视频开始采样,通过麦克风和摄像头来接受我们的音频信息和图像信息,这通常是同时进行的,不过,通常视频的采集会比音频的采集慢&…...
前端Sass面试题及参考答案
目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…...
Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
AF3 unify_template_features 函数解读
AlphaFold3 data_pipeline 模块的 unify_template_features 函数用于将多条链的模板特征整合为一个统一的 FeatureDict,以适应对多链复合物的处理。每条链的模板特征经过索引偏移处理后,拼接为一个完整的模板特征矩阵。 该方法的核心在于: 序列对齐:根据每条链的长度,将模…...
Python的__enter__方法返回非自身对象与资源管理代理模式的设计
Python的上下文管理器通过__enter__和__exit__方法实现了资源的自动管理,但鲜为人知的是,__enter__方法可以返回非自身对象,这一特性为资源管理代理模式的设计提供了更多可能性。这种设计模式不仅简化了代码结构,还增强了灵活性和…...
UDOP-large入门指南:零基础部署,快速实现英文文档智能理解
UDOP-large入门指南:零基础部署,快速实现英文文档智能理解 1. UDOP-large简介:你的英文文档智能助手 Microsoft UDOP-large是微软研究院开发的通用文档处理模型,专门用于理解和分析英文文档。这个模型结合了视觉理解和文本理解能…...
优化DMA串口通信:避免数据覆盖的实战策略
1. DMA串口通信的数据覆盖问题解析 第一次遇到DMA串口通信数据覆盖问题时,我正在调试一个ADC采集项目。主函数里连续发送两条数据,结果接收端收到的数据总是残缺不全,第二条数据的前半部分莫名其妙地覆盖了第一条数据的后半段。当时我的第一反…...
知识图谱网站案例综述
当人们第一次接触“知识图谱网站”时,往往容易把重点放在“图”上,仿佛只要网页上出现节点、连线或关系网络图,就已经完成了知识图谱应用。实际上,这种理解过于表面。知识图谱的核心,不在于是否画出了一张图࿰…...
别再手动改宏定义了!用Keil Configuration Wizard给你的.h文件加个可视化界面
Keil Configuration Wizard:让嵌入式开发告别手改宏定义的黑暗时代 每次接手一个老旧的嵌入式项目,看到满屏密密麻麻的宏定义时,你是不是也感到一阵眩晕?那些隐藏在.h文件深处的#define USE_IWDG 0和#define LOWPOWER_MODE 1&…...
从官网到终端:手把手教你解读PyTorch官网版本矩阵,找到最适合你显卡的torch组合
从官网到终端:手把手教你解读PyTorch官网版本矩阵,找到最适合你显卡的torch组合 每次打开PyTorch官网的版本矩阵页面,看到密密麻麻的版本号和CUDA选项,你是不是也感到一阵眩晕?作为深度学习开发者,我们都经…...
DS:具体详细介绍常见的DDR性能瓶颈和解决方案
DDR的性能瓶颈本质上是其内部“资源池”在并发访问下的限制。理解并解决这些瓶颈,是释放系统潜能的关键。 📊 DDR性能瓶颈与解决方案全景图 为了让你快速把握核心脉络,我将这些瓶颈和对应的优化策略总结为下表:瓶颈类别核心问题影…...
STM32开发者必看:5分钟搞定Nanopb协议移植(附常见编译错误解决)
STM32开发者必看:5分钟搞定Nanopb协议移植(附常见编译错误解决) 在嵌入式开发领域,设备间通信协议的选择往往需要在性能和资源消耗之间寻找平衡点。对于STM32这类资源受限的MCU来说,传统的JSON或XML解析器常常显得过于…...
法大大:新一代合同管理数智化服务商
深圳法大大网络科技有限公司是一家专注于电子合同及智能合同管理服务的科技企业,业务覆盖中国全境、港澳大湾区及全球超过100个国家和地区。公司通过电子签名技术与智能管理系统,为企业提供从合同起草、签署、归档到证据保全的全流程数字化解决方案&…...
用51单片机+红外遥控器做个智能台灯:手把手教你解析NEC协议(附完整代码)
用51单片机红外遥控器打造智能台灯:从NEC协议解析到功能实现全攻略 在智能家居设备层出不穷的今天,自己动手制作一个个性化的智能台灯不仅能满足实际需求,更能深入理解嵌入式系统的开发流程。本文将带你从零开始,使用51单片机和普…...
