Spring Security 与 OAuth 2.0 登录实现指南

news2024/11/24 5:34:58

文章目录

    • 一、项目概述
    • 二、环境准备
    • 三、创建GitHub OAuth应用
    • 四、项目依赖配置
    • 五、配置OAuth 2.0
    • 六、创建控制器
    • 七、创建视图
    • 八、运行应用
    • 九、用户界面展示
    • 十、总结

在现代的Web应用中,安全性是一个不可忽视的因素。OAuth 2.0作为一种流行的授权框架,提供了一种便捷的方式让用户通过社交平台(如GitHub)登录你的应用。本文将详细介绍如何使用Spring Security实现OAuth 2.0登录,并在页面上展示用户信息。

一、项目概述

本项目旨在实现一个简单的Web应用,允许用户通过GitHub进行登录。我们将使用Spring Boot和Spring Security进行快速开发。

二、环境准备

确保你已经安装了以下环境:

  • JDK 8或更高版本
  • Maven或Gradle
  • IDE(如IntelliJ IDEA或Eclipse)

三、创建GitHub OAuth应用

在开始编码之前,你需要在GitHub上创建一个OAuth应用。以下是创建过程的步骤:

  1. 登录GitHub:访问GitHub官网并登录你的账号。

  2. 进入设置:点击右上角的个人头像,选择“Settings”。

    进入设置

  3. 找到OAuth应用:在左侧菜单中,点击“Developer settings”,然后选择“OAuth Apps”。

    找到OAuth应用

    image-20241012150219059

  4. 注册新应用:点击“New OAuth App”按钮。

    注册新应用

  5. 填写应用信息:填写应用名称、主页 URL 和回调 URL(通常是 http://localhost:8080/login/oauth2/code/github),然后点击“Register application”。

    填写应用信息

  6. 获取Client ID和Client Secret:注册完成后,你会看到Client ID和Client Secret,保存这两个值。

    获取Client ID和Client Secretimage-20241012151907683image-20241012152020757

四、项目依赖配置

在你的pom.xml中添加以下依赖(如果你使用的是Maven):

image-20241012152612818

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

五、配置OAuth 2.0

application.yml中配置GitHub的OAuth 2.0客户端信息,填入你在上面步骤中获取的client-idclient-secret

spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: 填入你的数据
            client-secret: 填入你的数据

六、创建控制器

接下来,我们需要创建一个控制器来处理登录后的请求。以下是IndexController的代码:

package com.takumilove.oauth2logindemo.controller;

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 RaoPengFei
 * @create 2024/10/12
 */
@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";
    }
}

七、创建视图

使用Thymeleaf创建登录后的视图,以下是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>

八、运行应用

确保所有配置无误后,运行你的Spring Boot应用。访问http://localhost:8080,你将看到一个通过GitHub登录的选项。

九、用户界面展示

在用户成功登录后,界面将显示用户信息,如下图所示:

登录成功界面

十、总结

本文详细介绍了如何使用Spring Security实现OAuth 2.0登录,并展示了用户信息。希望通过这些步骤,你能够顺利地实现GitHub登录功能,提升你的应用安全性和用户体验。

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

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

相关文章

浅析主流监控告警系统基本架构和原理

浅析主流监控告警系统基本架构和原理 一&#xff0c;监控系统的作用和目前主流监控系统 1&#xff0c;作用&#xff1a;监控系统一般有以下这几个作用 实时采集监控数据&#xff1a;包括硬件、操作系统、中间件、应用程序等各个维度的数据。实时反馈监控状态&#xff1a;通过…

论文笔记:RelationPrompt :Zero-Shot Relation Triplet Extraction

论文来源: ACL Findings 2022 论文链接:https://arxiv.org/pdf/2203.09101.pdf 论文代码:http://github.com/declare-lab/RelationPrompt 本篇论文是由阿里达摩院自然语言智能实验室于2022年发表的关于零样本关系抽取的顶会论文,本篇博客将记录我在阅读过程中的一些笔记…

AI自动生成PPT解决方案,AI生成PPT-PrensentationGen-Java实现

AI自动生成PPT解决方案&#xff0c;AI生成PPT-PrensentationGen-Java实现。 利用大语言模型生成PPT文件的SpringBoot Web应用&#xff0c;主要功能是自动化创建演示文稿&#xff0c;适用于快速制作演示材料&#xff0c;特色在于其高效的模板处理和文本替换技术。 点击视频观看…

Python入门:如何在Python中优雅地书写多行字符串!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 多行字符串📒📝 什么是多行字符串?📝 三重引号📝 字符串连接📝 反斜杠⚓️ 相关链接 ⚓️📖 介绍 📖 在编程过程中,时常会遇到需要使用多行字符串的场景。例如,在编写长参数、描述文本或代码文档时,多行字符串…

java生成日历数据列表并按日历格式导出到excel

日历格式输出 日历数据列表导出封装日历格式实体类效果 日历数据列表 /**** 封装日历数据* param year 年份* param month 月份*/public List<InspectionDailyStaffPlanCalendarData> selectCalendarDataList(int year,int month,List<InspectionDailyStaffPlan> …

centos7 Oracle 11g rac 静默安装(NFS配置共享存储)

1.环境信息准备 注意&#xff1a; 在配置网络时&#xff0c;Oracle RAC的每个节点必须具有至少两个以上的网卡&#xff0c;一张网卡对外提供网络服务&#xff0c;另一张网卡用于各个节点间的通信和心跳检测等。在配置RAC集群的网卡时&#xff0c;如果节点1的公共接口是eth0&…

随机变量及其分布

定义 1.随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。样本空间中的每个结果都对应于随机变量的一个值。随机变量的值可以是离散的&#xff0c;也可以是连续的。随机变量通常用大写字母表示&#xff0c;如 X、Y 或 Z。 2.随机变量和事…

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…

Java-sec-code学习2

Java-Sec-Code学习1-文件上传漏洞 case1 url: http://127.0.0.1:8080/file/any 这是一个典型的上传页面&#xff0c;我们尝试上传一个文件试试看。 直接上传一个jsp文件&#xff0c;发现可以直接上传&#xff0c;非常顺利。这意味这后端和前端都没有对文件类型进行任何限制。…

[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。

[旧日谈]关于Qt的刷新事件频率&#xff0c;以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候&#xff0c;发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候&#xff0c;其实软件本身的负载并不高&#xff0c;所以…

【LeetCode每日一题】——724.寻找数组的中心下标

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 724.寻找数组的中心下标 四【…

python基础路径的迁移

本人未安装anaconda或pycharm等&#xff0c;仅安装了某个python环境&#xff0c;因此以下方法仅针对基础python环境的迁移&#xff0c;不确保其他软件或插件正常运行 第一步将原python路径的整个文件夹剪切到新的路径下 第二步修改系统环境变量&#xff0c;将原来的python路径…

胤娲科技:AI绘梦师——一键复刻梵高《星空》

想象一下&#xff0c;你手中握有一张梵高的《星空》原图&#xff0c;只需轻轻一点&#xff0c;AI便能化身绘画大师&#xff0c;一步步在画布上重现那璀璨星河。 这不是科幻电影中的桥段&#xff0c;而是华盛顿大学科研团队带来的“Inverse Painting”项目&#xff0c;正悄然改变…

【软件工程】McCabe复杂度计算

文章目录 一、定义与公式二、计算步骤三、示例四、注意事项 McCabe复杂度&#xff0c;又称为环路复杂度&#xff08;Cyclomatic Complexity&#xff09;&#xff0c;是一种用来度量软件程序复杂度的经典方法。它通过计算程序中独立路径的数量&#xff0c;帮助开发人员理解代码的…

CMIP6数据处理 ▎单点降尺度、统计方法的区域降尺度、基于WRF模式的动力降尺度

CMIP6数据被广泛应用于全球和地区的气候变化研究、极端天气和气候事件研究、气候变化影响和风险评估、气候变化的不确定性研究、气候反馈和敏感性研究以及气候政策和决策支持等多个领域。这些数据为我们理解和预测气候变化&#xff0c;评估气候变化的影响和风险&#xff0c;以及…

【从感知机到神经网络】

感知机 什么是感知机 公式、框图表示 直观举例 根据身高体重判断胖瘦的感知机。 1、根据已知样本训练出一条直线&#xff0c;用于对非训练样本进行分类&#xff0c;这条直线就是感知机模型。 三维情况下感知机模型是一个平面 感知机的缺陷 缺陷原因 不能处理异或问题&…

【hot100-java】路径总和 III

二叉树篇。 灵神题解 ps: 完结 历时许久的hot100终于结束了&#xff0c;先是python&#xff0c;后是java。 学到了不少语法&#xff0c;也挺爽的&#xff0c;希望接下来几遍会更加熟悉哈哈哈。

解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第1章 ARM Cortex-M处理器简介

1. 三级流水线设计 解释:三级流水线设计意味着处理器在执行指令时可以同时处理多个步骤。这些步骤通常包括取指(Fetch)、译码(Decode)和执行(Execute)。好处:这种设计提高了指令的执行效率,使得处理器能够在每个时钟周期内完成更多的工作,从而提升整体性能。2. 哈佛总…

linux 效率化 - zsh + tmux

文章目录 简介涉及的资料/代码仓库让我们开始吧1. Oh my Zsh!2. 终端主题 - powerlevel10k &#xff08;赋能优雅终端界面&#xff09;3. Oh my Tmux!安装完成&#xff0c;再加点料1. tmux2. zsh 结语参考资料 简介 来看一段操作演示&#xff08;全程键盘&#xff0c;没有鼠标…

Linux系统——RAID

Linux系统——RAID 一、RAID二、模拟RAID创建使用1、创建RAID 52、挂载使用3、模拟RAID 5故障 三、RAID操作方式 一、RAID 冗余磁盘阵列 作用&#xff1a; 1、加快数据读写速度 2、提升数据可靠性 使用原则&#xff1a; 使用同品牌、同型号、同容量的硬盘 RAID 0 至少两块硬盘…