14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制

Spring Security 是一个强大且高度可定制的认证和访问控制框架,专为基于 Spring 的应用程序设计。它为基于 Java EE 的企业应用程序提供了全面的安全解决方案,包括 Web 应用程序安全和方法级安全性。

Spring Security 的工作流程通常包括以下几个步骤:

拦截请求:通过过滤器链拦截所有进入应用程序的请求。
认证用户:如果请求需要认证,Spring Security 会引导用户到登录页面,并验证用户提供的凭据。
授权访问:认证成功后,Spring Security 检查用户是否有权访问请求的资源。
处理请求:如果用户有权限,请求将被处理;否则,用户将被拒绝访问。

1. 创建 Spring Boot 项目

  1. 新建项目
    • 打开 IntelliJ IDEA,选择 File → New → Project
    • 选择 Maven,填写项目名称(如 demo),选择合适的 JDK 版本(建议 17),点击 Next
    • 输入 GroupId(如 com.example)和 ArtifactId(如 demo),选择打包方式为 jar,点击 Next
    • 点击 Finish 完成项目创建。

2. 配置 pom.xml

pom.xml 中添加 Spring Boot 3.1.5 父依赖和 Spring Security 依赖:
在 pom.xml 中引入 Spring Security 依赖后,默认情况下会拦截所有请求,但 Spring Security 提供了一些默认配置和机制来处理这些请求。以下是默认行为的详细说明:

默认拦截行为
拦截所有请求:Spring Security 默认会拦截所有进入应用的 HTTP 请求,要求用户进行认证后才能访问受保护的资源。
默认登录页面:如果用户未登录而尝试访问受保护的资源,Spring Security 会自动重定向到默认的登录页面(路径为 /login)。
默认用户名和密码:首次启动应用时,Spring Security 会生成一个默认的用户名(user)和一个随机密码,并在控制台输出这些信息。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot with Spring Security</description><!-- Spring Boot 3.1.5 父依赖 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.5</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>17</java.version> <!-- Spring Boot 3.x 需要 Java 17 --></properties><dependencies><!-- Spring Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Security 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies><build><plugins><!-- Spring Boot Maven 插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3. 创建 Spring Boot 启动类

src/main/java 下创建包(如 com.example.demo),并创建 DemoApplication.java

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

在这里插入图片描述

4. 创建 Security 配置类

在相同的包下创建 SecurityConfig.java,用于配置 Spring Security:

package com.example.demo;import org.springframework.context.annotation.Bean;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;/*** Spring Security 配置类* 该类用于配置 Spring Security 的安全规则、用户认证和授权。*/
@Configuration
@EnableWebSecurity
public class SecurityConfig {/*** 配置安全过滤器链,定义请求的安全规则。** @param http HttpSecurity 对象,用于配置 HTTP 请求的安全规则。* @return 配置好的 SecurityFilterChain 对象。* @throws Exception 如果配置过程中出现错误。*/@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// 配置请求的授权规则.authorizeHttpRequests(authorize -> authorize// 允许所有人访问 /public/** 路径下的请求.requestMatchers("/public/**").permitAll()// 其他所有请求都需要认证.anyRequest().authenticated())// 配置表单登录.formLogin(form -> form// 允许所有人访问登录页面.permitAll())// 配置注销功能.logout(logout -> logout// 允许所有人访问注销功能.permitAll());// 返回构建好的 SecurityFilterChainreturn http.build();}/*** 配置用户详细信息服务,用于提供用户认证的信息。* 这里使用内存中的用户存储,实际应用中可以替换为数据库或其他用户存储。** @return 配置好的 UserDetailsService 对象。*/@Beanpublic UserDetailsService userDetailsService() {// 创建一个内存中的用户UserDetails user = User.builder()// 设置用户名.username("user")// 设置密码,使用 PasswordEncoder 对密码进行加密.password(passwordEncoder().encode("password"))// 设置用户角色.roles("USER")// 构建用户对象.build();// 返回内存用户管理器,用于管理用户信息return new InMemoryUserDetailsManager(user);}/*** 配置密码编码器,用于对用户密码进行加密和解密。** @return 配置好的 PasswordEncoder 对象。*/@Beanpublic PasswordEncoder passwordEncoder() {// 返回 BCrypt 密码编码器return new BCryptPasswordEncoder();}
}

在这里插入图片描述

5. 创建控制器

在相同的包下创建 HelloController.java,提供一个简单的受保护端点:

package com.example.demo;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, Spring Security!";}@GetMapping("/public/hello")public String sayHelloPublic() {return "Hello, Public!";}
}

在这里插入图片描述

6. 运行和测试

  1. 启动应用
    • 右键点击 DemoApplication.java,选择 Run,或点击类名旁边的绿色箭头。
      在这里插入图片描述
  2. 测试接口
    • 打开浏览器,访问 http://localhost:8080/public/hello,页面应返回 Hello, Public!
      在这里插入图片描述
    • 访问 http://localhost:8080/hello,将会被重定向到登录页面。
      在这里插入图片描述
    • 使用用户名 user 和密码 password 登录,登录成功后,访问 http://localhost:8080/hello,页面应返回 Hello, Spring Security!
      在这里插入图片描述

总结

通过以上步骤,已经成功创建了一个简单的 Spring Boot 应用,并集成了 Spring Security 进行基本的认证和授权。此示例中,创建了一个受保护的端点 /hello 和一个公共端点 /public/hello。Spring Security 确保只有经过身份验证的用户才能访问受保护的端点。

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

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

相关文章

Linux学习笔记(二):Linux权限管理

文章目录 一、Linux下用户的分类1. Linux下用户分为两类&#xff1a;2. 这两类用户如何进行切换呢&#xff1f;3. 短暂提权 二、何为权限1. 什么是权限2. Linux的文件后缀意义 三、修改权限1. 设置文件的访问权限——chmod2. 修改文件拥有者——chown3. 修改文件所属组——chgr…

学习alpha,第2个alpha

alphas (-1 * ts_corr(rank(ts_delta(log(volume), 2)), rank(((close - open) / open)), 6)) 先分析操作符从左到右 ts_corr: Pearson 相关度量两个变量之间的线性关系。当变量呈正态分布且关系呈线性时&#xff0c;它最有效。 ts_corr(vwap, close, 20)是一个计算时间序列相…

Paddle Serving|部署一个自己的OCR识别服务器

前言 之前使用C部署了自己的OCR识别服务器&#xff0c;Socket网络传输部分是自己写的&#xff0c;回过头来一看&#xff0c;自己犯傻了&#xff0c;PaddleOCR本来就有自己的OCR服务器项目&#xff0c;叫PaddleServing&#xff0c;这里记录一下部署过程。 1 下载依赖环境 1.1 …

React Native【详解】搭建开发环境,创建项目,启动项目

下载安装 node https://nodejs.cn/download/ 查看 npx 版本 npx -v若无 npx 则安装 npm install -g npx创建项目 npx create-expo-applatestRN_demo 为自定义的项目名称 下载安装 Python 2.7 下载安装 JAVA JDK https://www.oracle.com/java/technologies/downloads/#jdk24-…

NVIDIA Halos:智能汽车革命中的全栈式安全系统

高级辅助驾驶行业正面临一个尴尬的"安全悖论"——传感器数量翻倍的同时&#xff0c;事故率曲线却迟迟不见明显下降。究其原因&#xff0c;当前行业普遍存在三大技术困局&#xff1a; 碎片化安全方案 传统方案就像"打补丁"&#xff0c;激光雷达厂商只管点云…

数据资产管理与AI融合:物联网时代的新征程

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;数据资产已成为企业和组织的核心竞争力之一。随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;海量的数据如潮水般涌来&#xff0c;如何高效地管理和利用这些数据资产成为了亟待解决的问题。与此同时&am…

MySQL 表的内外连接

文章目录 表的内外连接&#xff08;重点&#xff09;内连接外连接左外连接右外连接 表的内外连接&#xff08;重点&#xff09; 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使…

VTK 交互类介绍

基本概念 交互器(Interactor): 处理用户输入事件的基础类 交互样式(InteractorStyle): 定义具体的交互行为 Widgets: 可交互的UI组件,如滑块、按钮等 Picker: 用于选择场景中的对象 常用交互类 类名功能描述vtkRenderWindowInteractor渲染窗口交互器vtkInteractorStyle交互样式…

C语言动态库与静态库编译测试示例详细介绍终结篇

C语言动态库与静态库编译链接时的详细对比与示例 下面我将提供更详细的示例&#xff0c;并通过对比表格清晰地展示静态库和动态库的特性差异以及它们之间的各种链接关系。 ## 1. 静态库与动态库特性对比 | 特性 | 静态库(.a/.lib) | 动态…

神经网络:节点、隐藏层与非线性学习

神经网络&#xff1a;节点、隐藏层与非线性学习 摘要&#xff1a; 神经网络是机器学习领域中一种强大的工具&#xff0c;能够通过复杂的结构学习数据中的非线性关系。本文从基础的线性模型出发&#xff0c;逐步深入探讨神经网络中节点和隐藏层的作用&#xff0c;以及它们如何…

POI创建Excel文件

文章目录 1、背景2、创建表格2.1 定义表头对象2.2 Excel生成器2.3 创建模板2.4 处理Excel表头2.5 处理Excel内容单元格样式2.6 处理单个表头 3、追加sheet4、静态工具5、单元测试6、完整代码示例 1、背景 需求中有需要用户自定义Excel表格表头&#xff0c;然后生成Excel文件&a…

【分布式系统中的“瑞士军刀”_ Zookeeper】三、Zookeeper 在实际项目中的应用场景与案例分析

在分布式系统日益复杂的当下&#xff0c;Zookeeper 凭借强大的协调能力成为众多项目的关键组件。本篇文章将结合实际项目场景&#xff0c;详细介绍 Zookeeper 在电商秒杀、微服务架构、分布式配置管理以及大数据处理集群等领域的应用&#xff0c;以及在不同的案例场景下的具体分…

【翻译、转载】MCP 提示 (Prompts)

原文地址&#xff1a;https://modelcontextprotocol.io/docs/concepts/prompts#python 提示 (Prompts) 创建可重用的提示模板和工作流 提示 (Prompts) 使服务器能够定义可重用的提示模板和工作流&#xff0c;客户端可以轻松地将其呈现给用户和 LLM。它们提供了一种强大的方式来…

accept() reject() hide()

1. accept() 用途 确认操作&#xff1a;表示用户完成了对话框的交互并确认了操作&#xff08;如点击“确定”按钮&#xff09;。 关闭模态对话框&#xff1a;结束 exec() 的事件循环&#xff0c;返回 QDialog::Accepted 结果码。适用场景 模态对话框&#xff08;通过 exec()…

如何查看电脑IP地址和归属地:全面指南

在数字化时代&#xff0c;了解自己电脑的IP地址和归属地信息变得越来越重要。无论是进行网络故障排查、远程办公设置&#xff0c;还是出于网络安全考虑&#xff0c;掌握这些基本信息都很有必要。本文将详细介绍如何查看电脑的公网IP、内网IP以及归属地信息&#xff0c;并提供常…

基于python生成taskc语言文件--时间片轮询

目录 前言 utf-8 chinese GB2312 utf-8 排除task.c chinese GB2312 排除task.c 运行结果 前言 建议是把能正常工作的单个功能函数放到一起&#xff08;就和放while函数里的程序一样&#xff09;&#xff0c;程序会按顺序自动配置。 不同的格式已经对应给出。 utf-8 impo…

Docker手动重构Nginx镜像,融入Lua、Redis功能

核心内容&#xff1a;Docker重构Nginx镜像&#xff0c;融入Lua、Redis功能 文章目录 前言一、准备工作1、说明2、下载模块3、Nginx配置文件3、Dockerfile配置文件3、准备工作全部结束 二、构建镜像三、基于镜像创建容器三、lua脚本的redis功能使用总结 前言 ⁣⁣⁣⁣ ⁣⁣⁣⁣…

DeepSeek+Excel:解锁办公效率新高度

目录 一、引言&#xff1a;Excel 遇上 DeepSeek二、认识 DeepSeek&#xff1a;大模型中的得力助手2.1 DeepSeek 的技术架构与原理2.2 DeepSeek 在办公场景中的独特优势 三、DeepSeek 与 Excel 结合的准备工作3.1 获取 DeepSeek API Key3.2 配置 Excel 环境 四、DeepSeekExcel 实…

解决Vue2------You may use special comments to disable some warnings.问题

问题截图 解决办法 打开项目中.eslintrc.js在rules中&#xff0c;添加以下代码&#xff0c;并extends的 vue/standard注释掉 space-before-function-paren: 0, semi: off, quotes : off, comma-dangle : off, vue/comment-directive: off

数据集-目标检测系列- 牙刷 检测数据集 toothbrush >> DataBall

数据集-目标检测系列- 牙刷 检测数据集 toothbrush >> DataBall DataBall 助力快速掌握数据集的信息和使用方式。 贵在坚持&#xff01; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/over…