Spring Boot 与 Spring Security 的集成及 OAuth2 实现

ops/2024/10/18 22:30:51/

  我的主页:2的n次方_   

在这里插入图片描述

在现代 Web 应用开发中,安全性是至关重要的。无论是保护用户的敏感数据,还是确保 API 只允许经过授权的请求访问,开发者都需要一个强大且灵活的安全框架来实现这些需求。Spring Security 作为 Spring 框架的安全模块,能够为应用提供全面的安全保护。而 OAuth2 作为一种授权协议,广泛应用于单点登录(SSO)、社交登录、API 保护等场景。本文将详细介绍如何在 Spring Boot 中集成 Spring Security,并实现 OAuth2 授权。

🍃1. Spring Security 的基础配置

Spring Security 是一个高度可定制的安全框架,它主要提供了身份认证和授权功能。通过 Spring Security,开发者可以定义哪些 URL 需要认证,哪些用户有权访问某些资源等。

首先,我们需要在项目中添加 Spring Security 的依赖。在 Spring Boot 项目中,这可以通过在 pom.xml 文件中添加以下依赖项来实现:

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

添加依赖后,Spring Boot 会自动为所有的 URL 添加一个基本的安全保护机制。默认情况下,所有的 HTTP 请求都需要进行身份认证。如果用户未登录,应用会自动跳转到一个默认的登录页面。

接下来,我们可以通过配置类来自定义安全规则。例如,我们可以创建一个 SecurityConfig 类,配置哪些 URL 允许匿名访问,哪些需要认证:

java">import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll()  // 允许匿名访问.anyRequest().authenticated()           // 其他请求需要认证.and().formLogin()                                // 启用表单登录.loginPage("/login")                    // 自定义登录页面.permitAll().and().logout()                                   // 启用注销功能.permitAll();}
}

在这个配置中,/public/** 路径下的所有资源都可以被匿名用户访问,而其他任何请求都需要用户登录后才能访问。我们还自定义了一个登录页面,这样用户在访问受保护的资源时,会被重定向到该页面。

🍃2. 集成 OAuth2 进行授权

OAuth2 是一种授权协议,允许第三方应用在不直接获取用户凭据的情况下访问用户的资源。使用 OAuth2,应用可以在保证安全的前提下,通过访问令牌来访问受保护的资源。

在 Spring Boot 中集成 OAuth2,首先需要添加相应的依赖:

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

接下来,我们需要在 application.yml 文件中配置 OAuth2 客户端信息。以 Google OAuth2 为例,我们可以这样配置:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_GOOGLE_CLIENT_ID
            client-secret: YOUR_GOOGLE_CLIENT_SECRET
            scope: profile, email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            client-name: Google
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
 

在这段配置中,我们提供了 Google OAuth2 客户端的 client-idclient-secret,以及相关的 OAuth2 端点 URL。当用户尝试登录时,应用会重定向到 Google 的授权页面,用户授权后,Google 会返回一个授权码,应用使用该授权码换取访问令牌,并获取用户信息。

🍃3. 使用 OAuth2 保护 API

为了保护我们的 API,使其只能通过 OAuth2 授权访问,我们需要将应用配置为资源服务器。资源服务器负责保护资源(如 API),并验证访问令牌的有效性。

我们可以通过以下配置实现资源服务器功能:

java">import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/public/**").permitAll()  // 允许匿名访问的API.antMatchers("/api/private/**").authenticated() // 需要OAuth2认证的API.and().oauth2Login(); // 启用 OAuth2 登录}
}

在这个配置中,/api/public/** 路径下的资源可以被匿名访问,而 /api/private/** 下的资源则需要用户通过 OAuth2 登录并携带有效的访问令牌才能访问。

🍃4. 前端集成与访问受保护的资源

在前端应用中(如使用 React 或 Angular),当用户通过 OAuth2 登录成功后,应用会获取到一个访问令牌。这个令牌需要在每次请求受保护的资源时附加在请求头中。

假设使用 axios 作为 HTTP 客户端,前端代码可能如下所示:

javascript">import axios from 'axios';const token = localStorage.getItem('access_token');axios.get('https://your-api.com/api/private/data', {headers: {'Authorization': `Bearer ${token}`}
})
.then(response => {console.log(response.data);
})
.catch(error => {console.error('Error fetching data:', error);
});

在这个例子中,我们从浏览器的 localStorage 中获取了访问令牌,并将其附加在请求头的 Authorization 字段中,以 Bearer 令牌的格式发送给后端服务器。资源服务器会验证这个令牌的有效性,如果验证通过,则允许访问受保护的资源。

🍃5. 总结

通过这篇博客,我们介绍了如何在 Spring Boot 中集成 Spring Security 和 OAuth2 进行安全保护。我们首先配置了基本的 Spring Security 设置,允许匿名访问公共资源,并保护其他资源。接着,我们配置了 OAuth2 客户端,使应用能够通过 Google 进行 OAuth2 授权。最后,我们展示了如何保护 API,使其只能通过 OAuth2 授权访问,并在前端应用中使用访问令牌请求受保护的资源。

这种安全机制不仅增强了应用的安全性,还能为用户提供更好的体验,比如通过社交账户快速登录。随着应用需求的增长,可以进一步扩展和定制这些配置,支持更复杂的业务场景。

在这里插入图片描述


http://www.ppmy.cn/ops/99108.html

相关文章

大数据毕业设计开题报告100例

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

爱吃香蕉的珂珂(LeetCode)

题目 珂珂喜欢吃香蕉。这里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选择一堆香蕉&#xff0c;从中吃…

spdlog日志库--纯头文件的

spdlog库 spdlog是基于C11实现的一款纯头文件的日志管理库&#xff08;git地址&#xff1a;GitHub - gabime/spdlog: Fast C logging library.&#xff0c;API说明&#xff1a;https://spdlog.docsforge.com/v1.x/1.quickstart/&#xff09;&#xff1a; 下载地址 https://git…

基于树莓派的智能AI网关接入豆包流程:HTTP/HTTPS、MQTT、Flask、Web可视化(代码示例)

一、项目概述 随着物联网和智能家居技术的迅速发展&#xff0c;越来越多的家庭开始关注环境监测和智能控制。本文介绍一个基于树莓派的智能AI网关项目&#xff0c;旨在通过接入豆包&#xff08;Doubao&#xff09;API&#xff0c;实现对家庭环境的实时监测和智能控制。 项目目…

迭代器的失效问题

vector的插入与删除 我们首先举例说明vector插入和删除操作返回的是什么迭代器 void print(std::vector<int>& vec) {for(auto itvec.begin();it!vec.end();it)std::cout<<*it<<" ";std::cout<<std::endl; }void test() {/*初始化vect…

免费图形化nginx管理工具nginxWebUI

nginxWebUI是一款图形化管理nginx配置得工具, 可以使用网页来快速配置nginx的各项功能, 包括http协议转发, tcp协议转发, 反向代理, 负载均衡, 静态html服务器, ssl证书自动申请、续签、配置等, 配置好后可一建生成nginx.conf文件, 同时可控制nginx使用此文件进行启动与重载, 完…

【机器学习-监督学习】支持向量机

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

WebSocket可拓展业务组件搭建,无侵入实现WebSocket通信信息自定义业务消费

组件概述 面对C端产品&#xff0c;往往会携带有客户端和服务端的双端通信以实现实时交互的效果&#xff0c;但是目前HTTP1.1并不支持双端通信&#xff0c;因此&#xff0c;对于聊天室、多人实时游戏等场景&#xff0c;就需要用到一个新的通信协议&#xff1a;WebSocket。 更多…