当前位置: 首页 > news >正文

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2,实现通过Github授权登录应用

文章目录

  • 基于SpringBoot和OAuth2,实现通过Github授权登录应用
    • 0. 引言
    • 1. 创建Github应用
    • 2. 创建SpringBoot测试项目
      • 2.1 初始化项目
      • 2.2 设置配置文件信息
      • 2.3 创建Controller层
      • 2.4 创建Html页面
    • 3. 启动应用
    • 4. 其他

0. 引言

在注册登录网站或者应用时,通常会有社交方式登录,例如在登录CSDN时,会提供多种登陆方式,如下图。

在这里插入图片描述
本文介绍通过SpringBoot和OAuth2,开发自己的应用,并实现通过Github授权登录。

1. 创建Github应用

  • 首先登录Github,进入到Settings-Developer Settings,点击OAuth Apps,新建New OAuth App
    在这里插入图片描述
  • 填写相关信息
    在这里插入图片描述

点击注册应用

  • 注册完成后打开,可以获得Client IDClient secrets

注意!
Client secrets要注意复制下来保存,不然在进入这个页面,也获取不到原来完整的Client secrets了,只能重新生成!

在这里插入图片描述

2. 创建SpringBoot测试项目

2.1 初始化项目

初始化项目,同时应包含以下依赖

Spring Web
Thymeleaf
Spring Security
OAuth2 Client

在这里插入图片描述
创建完成后,创建Controller文件和index文件。最终项目结构目录如下:
在这里插入图片描述

2.2 设置配置文件信息

application.yml:

spring:security:oauth2:client:registration:github:client-id: xxxclient-secret: xxx

将上面生成的client-id和client-secret写入配置文件

2.3 创建Controller层

IndexController.java

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;/*** @author SaoE* @date 2024/12/29 21:29*/
@Controller
public class IndexController {@GetMapping("/")public String index(Model model,@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient,@AuthenticationPrincipal OAuth2User oauth2User) {model.addAttribute("userName", oauth2User.getName());model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName());model.addAttribute("userAttributes", oauth2User.getAttributes());return "index";}
}

2.4 创建Html页面

resources/templates/index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head><title>Spring Security - OAuth 2.0 Login</title><meta charset="utf-8" />
</head>
<body>
<div style="float: right" th:fragment="logout" sec:authorize="isAuthenticated()"><div style="float:left"><span style="font-weight:bold">User: </span><span sec:authentication="name"></span></div><div style="float:none">&nbsp;</div><div style="float:right"><form action="#" th:action="@{/logout}" method="post"><input type="submit" value="Logout" /></form></div>
</div>
<h1>OAuth 2.0 Login with Spring Security</h1>
<div>You are successfully logged in <span style="font-weight:bold" th:text="${userName}"></span>via the OAuth 2.0 Client <span style="font-weight:bold" th:text="${clientName}"></span>
</div>
<div>&nbsp;</div>
<div><span style="font-weight:bold">User Attributes:</span><ul><li th:each="userAttribute : ${userAttributes}"><span style="font-weight:bold" th:text="${userAttribute.key}"></span>: <span th:text="${userAttribute.value}"></span></li></ul>
</div>
</body>
</html>

3. 启动应用

  • 在浏览器输入并访问http://localhost:8080/,此时浏览器将被重定向到默认的自动生成的登录页面,该页面显示了一个用于GitHub登录的链接。
    在这里插入图片描述

点击授权

  • 此时,OAuth客户端访问GitHub的获取用户信息的接口获取基本个人资料信息,并建立一个已认证的会话。
    在这里插入图片描述

4. 其他

SpringBoot源码的CommonOAuth2Provider类中,默认配置了GOOGLEFACEBOOKGITHUBOKTA的授权登录配置
在这里插入图片描述
以Github为例,默认配置如下:

    GITHUB {public Builder getBuilder(String registrationId) {Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}");builder.scope(new String[]{"read:user"});builder.authorizationUri("https://github.com/login/oauth/authorize");builder.tokenUri("https://github.com/login/oauth/access_token");builder.userInfoUri("https://api.github.com/user");builder.userNameAttributeName("id");builder.clientName("GitHub");return builder;}},

相关文章:

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用 文章目录 基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用0. 引言1. 创建Github应用2. 创建SpringBoot测试项目2.1 初始化项目2.2 设置配置文件信息2.3 创建Controller层2.4 创建Html页面 3. 启动…...

macos 支持外接高分辩率显示器开源控制软件

macos 支持外接高分辩率显示器开源控制软件 软件&#xff08;app应用&#xff09;名&#xff1a;BetterDisplay 官方地址&#xff1a; https://github.com/waydabber/BetterDisplay...

C++26 新特性预览(Preview)

文章目录 1. 静态反射 (Static Reflection)示例: 枚举转字符串应用场景 2. 合约 (Contracts)示例: 定义函数合约应用场景 3. 条件中的结构化绑定 (Structured Bindings in Conditions)示例: 改进的错误处理应用场景 4. 包索引 (Pack Indexing)示例: 获取参数包的第一个和最后一…...

MySQL5.7.26-Linux-安装(2024.12)

文章目录 1.下载压缩包1.访问MySQL版本归档2.找到5.7.26并下载3.百度网盘 2.Linux安装1.卸载原来的MySQL8.0.26&#xff08;如果没有则无需在意&#xff09;1.查看所有mysql的包2.批量卸载3.删除残留文件**配置文件**&#xff08;默认路径&#xff09;&#xff1a; 4.**验证卸载…...

2025-1-2-sklearn学习(30)模型选择与评估-验证曲线: 绘制分数以评估模型 真珠帘卷玉楼空,天淡银河垂地。

文章目录 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型30.1. 验证曲线30.2. 学习曲线 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型 文章参考网站&#xff1a; https://sklearn.apachecn.org/ 和 https://scikit-learn.org/stable/ 每种估…...

【优选算法】查找总价格为目标值的两个商品

链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;利用单调性&#xff0c;使用双指针算法解决问题 1.先从小到大排序 2. sum > t : right--; sum < t : left; sum t : return class Solution {public…...

利用 NineData 实现 PostgreSQL 到 Kafka 的高效数据同步

记录一次 PostgreSQL 到 Kafka 的数据迁移实践。前段时间&#xff0c;NineData 的某个客户在一个项目中需要将 PostgreSQL 的数据实时同步到 Kafka。需求明确且普遍&#xff1a; PostgreSQL 中的交易数据&#xff0c;需要实时推送到 Kafka&#xff0c;供下游多个系统消费&#…...

future和CompletableFuture

future 什么是future Future 类是并发编程中一个非常重要的工具。它主要用于表示一个异步计算的结果&#xff0c;允许你在计算完成后获取结果或处理异常。Java 的 Future 也常常与线程池&#xff08;如 ExecutorService&#xff09;结合使用&#xff0c;用来执行并行任务&…...

如何通过深度学习提升大分辨率图像预测准确率?

随着科技的不断进步&#xff0c;图像处理在各个领域的应用日益广泛&#xff0c;特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中&#xff0c;大分辨率图像的使用已经成为了一项不可或缺的技术。然而&#xff0c;大分辨率图像带来了巨大的计算和存储压力&#xff0c;同…...

【机器学习】机器学习的基本分类-半监督学习-Ladder Networks

Ladder Networks 是一种半监督学习模型&#xff0c;通过将无监督学习与监督学习相结合&#xff0c;在标记数据较少的情况下实现高效的学习。它最初由 A. Rasmus 等人在 2015 年提出&#xff0c;特别适合深度学习任务&#xff0c;如图像分类或自然语言处理。 核心思想 Ladder N…...

[react]小技巧, ts如何声明点击事件的类型

很简单, 鼠标放到事件上面就行了 如果想知道点击的是什么元素 ,打印他的nodename就行了 不过得断言为html元素才行 const handleClick (e: React.MouseEvent<HTMLDivElement, MouseEvent>) > {console.log(current, (e.target as HTMLElement).nodeName);}; 为什么…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...

【从零开始】11. LLaMA-Factory 微调 Qwen 模型(番外篇)

书接上回&#xff0c;在完成了 RAGChecker 测试后&#xff0c;离 RAG 应用真正发布还差最后一步 - 基础信息指令微调。考虑到模型还是需要具备一定程度的“自我认知”&#xff0c;因此需要将公司信息“嵌入”到模型里面的。为此&#xff0c;我选择了 LLaMA-Factory&#xff08;…...

WPF使用ContentControl控件实现区域导航,并使用Prism依赖注入优化

背景&#xff1a;使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的&#xff0c;不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel&#xff1a; private object body;public object Body {get { retu…...

JavaWeb——MySQL-DML(1/3)-添加数据insert(DML 操作概述、INSERT 语句插入数据、语句演示、总结)

目录 DML 操作概述 INSERT 语句插入数据 INSERT 语句基础语法 INSERT 语句演示 注意事项 总结 DML 操作概述 DML 简介 DML&#xff08;Data Manipulation Language&#xff09;即数据操作语言&#xff0c;用于对数据库表中的数据进行增删改操作&#xff0c;包括添加数据&…...

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷&#xff0c;但除了将数据从索尼传输到Android之外。众所周知&#xff0c;旧的索尼手机上存储着大量的文件&#xff0c;因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题&#xff0c;我们做…...

嵌入式应用实例→电子产品量产工具→UI界面的绘制和测试

前言 之前已经在博文https://blog.csdn.net/wenhao_ir/article/details/144747714中实现了用Freetype在LCD屏上绘制字符&#xff0c;本篇博文我们利用Freetype实现UI界面的绘制。 头文件include\ui.h的分析 头文件内的代码 #ifndef _UI_H #define _UI_H#include <common…...

如何删除 Docker 中的悬虚镜像?

在 Docker 中&#xff0c;悬虚镜像&#xff08;Dangling Images&#xff09;是指那些没有 标签 且没有被任何容器使用的镜像。这些镜像通常是由于构建过程中生成的中间层镜像或未正确清理的镜像残留。删除悬虚镜像可以释放磁盘空间并保持 Docker 环境的整洁。 1. 列出悬虚镜像…...

el-table树形懒加载展开改为点击行展开

思路&#xff1a;获取el-table中小箭头&#xff0c;然后调它的click事件&#xff01; <el-tablerow-click"getOpenDetail":row-class-name"tableRowClassName">// 点击当前行展开节点getOpenDetail(row, column, event) {// 如果是叶子节点或点击的是…...

【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)

Ubuntu server 18.04 搭建Slurm并行计算环境&#xff08;包含NFS&#xff09; 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…...

C++笔记 继承关系中构造和析构顺序(面向对象)

在C面向对象编程中&#xff0c;继承是实现代码复用和类层次设计的核心特性。当存在基类与派生类的继承关系时&#xff0c;构造函数和析构函数的调用顺序有严格的规则——这不仅是面试高频考点&#xff0c;更是避免内存泄漏、保证对象正确初始化/清理的关键。核心结论先明确&…...

ai辅助cad开发:让快马平台的kimi模型帮你思考和编写参数化设计代码

AI辅助CAD开发&#xff1a;让快马平台的Kimi模型帮你思考和编写参数化设计代码 最近在做一个参数化齿轮生成器的项目&#xff0c;发现用传统方式开发效率很低。后来尝试用InsCode(快马)平台的AI辅助功能&#xff0c;整个过程变得轻松多了。这里分享下我的开发经验&#xff0c;…...

BiliTools:B站资源高效管理与下载完全指南

BiliTools&#xff1a;B站资源高效管理与下载完全指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools是一…...

如何突破Office功能限制?本地化激活方案全解析

如何突破Office功能限制&#xff1f;本地化激活方案全解析 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook 当…...

Z-Image Turbo实际作品分享:城市风光生成效果

Z-Image Turbo实际作品分享&#xff1a;城市风光生成效果 本文所有内容均为技术效果展示&#xff0c;不涉及任何政治敏感内容&#xff0c;所有案例均为技术演示用途。 1. 效果概览&#xff1a;城市风光的AI艺术呈现 Z-Image Turbo作为基于Gradio和Diffusers构建的高性能AI绘图…...

实战应用:基于快马平台从零到一构建功能完备的openclaw101风格项目平台

今天想和大家分享一个实战经验&#xff1a;如何从零开始构建一个功能完备的开源项目托管平台。类似openclaw101这样的网站&#xff0c;其实用现代开发工具和云平台可以快速实现。下面我就把整个搭建过程拆解成几个关键环节&#xff0c;希望能给想做类似项目的朋友一些参考。 项…...

League Akari:英雄联盟玩家的终极智能工具箱 - 3大核心功能深度解析

League Akari&#xff1a;英雄联盟玩家的终极智能工具箱 - 3大核心功能深度解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟…...

2026年硕士论文降AIGC率必备工具:4款实测效果对比

试了四五款工具&#xff0c;最后留下来的就这几个。先说结论&#xff1a;降AIGC率这个需求&#xff0c;嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;是目前性价比最高的选择&#xff0c;4.8元/千字&#xff0c;达标率99.26%。 如果对价格不敏感、对知网特别严格&#…...

酒精测试仪

简 介&#xff1a; 本文介绍了一款酒精测试仪的使用方法。测试仪开机后需等待15秒预热&#xff08;数字倒计时&#xff09;&#xff0c;预热结束后对着吹气口吹气3秒即可显示测量结果。实验表明&#xff0c;该仪器灵敏度较高&#xff1a;直接吹气显示11左右&#xff0c;不吹气显…...

从零构建STM32 OTA升级系统:BootLoader设计、IAP实现与APP无缝跳转实战

1. 为什么需要OTA升级系统 想象一下你开发的智能硬件产品已经卖出去几千台&#xff0c;突然发现固件有个致命bug需要修复&#xff0c;或者要增加一个用户期待已久的新功能。传统做法是让用户把设备寄回工厂&#xff0c;或者带着设备到维修点刷机——这简直是开发者的噩梦&#…...