SpringBoot开发——SpringSecurity安全框架17个业务场景案例(三)

文章目录

  • 一、Spring Security 常用应用场景介绍
  • 二、Spring Security场景案例
    • 12 表达式支持(Expression-Based)
      • 12.1 Spring Security 配置
      • 12.2 业务逻辑代码
      • 12.3 控制器
    • 13、安全上下文(Security Context)
      • 13.1 Spring Security 配置
      • 13.2 业务逻辑代码
      • 13.3 控制器
    • 14、安全过滤器链(Security Filter Chain)
      • 14.1 Spring Security 配置
      • 14.2 业务逻辑代码
      • 14.3 控制器
    • 15、用户详细信息服务(UserDetailsService)
      • 15.1 Spring Security 配置
      • 15.2 业务逻辑代码
      • 15.3 控制器
    • 16、多因素认证(Multi-Factor Authentication)
      • 16.1 Spring Security 配置
      • 16.2 业务逻辑代码
      • 16.3 控制器
    • 17、匿名访问(Anonymous Access)
      • 17.1 Spring Security 配置
      • 17.2 业务逻辑代码
      • 17.3 控制器

Spring Security通过一系列注解简化了安全配置,我们将深入探讨 Spring Security框架的17个关键应用场景,包括认证、授权、 OAuth2CSRF保护等。每个案例都配有详细的时序图和代码示例,旨在帮助开发者全面理解并有效利用 Spring Security的强大功能,以构建更安全、更可靠的应用程序。

一、Spring Security 常用应用场景介绍

1、认证(Authentication)

  • 应用场景:确保只有经过验证的用户才能访问应用程序。

2、授权(Authorization)

  • 应用场景:控制用户对特定资源的访问权限,如角色基础的访问控制。

3、表单登录(Form-Based Login)

  • 应用场景:为用户提供登录表单,处理登录请求和重定向。

4、HTTP 基本认证(HTTP Basic Authentication)

  • 应用场景:为 RESTful API 或其他服务提供基础的用户名和密码认证。

5、OAuth2 和 OpenID Connect

  • 应用场景:支持现代的授权框架,适用于需要第三方应用认证的场景。

6、CSRF 保护(CSRF Protection)

  • 应用场景:防止跨站请求伪造攻击,保护 Web 应用程序的安全。

7、密码编码(Password Encoding)

  • 应用场景:安全地存储用户密码,防止密码泄露。

8、方法级安全性(Method Security)

  • 应用场景:控制对特定方法或 Bean 属性的访问,实现细粒度的安全控制。

9、异常处理(Exception Handling)

  • 应用场景:自定义安全相关的异常处理,如认证失败、授权失败。

10、记住我(Remember-Me)

  • 应用场景:为用户提供持久的登录状态,方便用户再次访问。

11、预授权(Pre-Invocation)

  • 应用场景:在方法执行前进行安全检查,确保方法调用的安全性。

12、表达式支持(Expression-Based)

  • 应用场景:使用 Spring Expression Language (SpEL) 实现复杂的安全逻辑。

13、安全上下文(Security Context)

  • 应用场景:管理和检索认证信息,如获取当前认证用户。

14、安全过滤器链(Security Filter Chain)

  • 应用场景:处理 HTTP 请求的安全检查,如认证、授权。

15、用户详细信息服务(UserDetailsService)

  • 应用场景:自定义用户认证信息的加载逻辑,如从数据库加载用户数据。

16、多因素认证(Multi-Factor Authentication)

  • 应用场景:增加额外的安全层,如短信验证码、电子邮件确认。

17、匿名访问(Anonymous Access)

  • 应用场景:允许未认证的用户访问某些公共资源。

二、Spring Security场景案例

12 表达式支持(Expression-Based)

业务场景: 一个在线文档管理系统,其中某些文档的访问权限依赖于用户的多个属性,例如部门和角色。需要使用复杂的表达式来确定用户是否有权访问特定文档。

业务时序图
在这里插入图片描述
1.用户(User) 请求一个资源。

2.浏览器(Browser) 向服务器(Server)发送HTTP 请求

3.服务器(Server) 的 认证管理器(AuthenticationManager) 对请求进行认证。

4.认证管理器(AuthenticationManager) 返回认证令牌给服务器。

5.服务器(Server) 的 方法安全拦截器(MethodSecurityInterceptor) 检查授权。

6.方法安全拦截器(MethodSecurityInterceptor) 请求 表达式评估器(ExpressionEvaluator) 处理SpEL 表达式

7.表达式评估器(ExpressionEvaluator) 根据当前的安全上下文和定义的表达式返回评估结果。

8.方法安全拦截器(MethodSecurityInterceptor) 根据评估结果做出访问决策。

9.服务器(Server) 将响应返回给浏览器。

12.1 Spring Security 配置

首先,我们需要配置Spring Security以启用表达式支持。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()                 .antMatchers("/documents/**").access("hasRole('ADMIN') or hasAuthority('DOCUMENT_READ')").anyRequest().authenticated().and().formLogin().loginPage("/login")              .defaultSuccessUrl("/home")            .and().logout().logoutSuccessUrl("/login?logout");}}

12.2 业务逻辑代码

创建一个服务来处理文档访问,并使用表达式来定义访问权限。

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;@Service
public class DocumentService {/*** 获取文档内容* * @param documentId 文档ID* @return 文档内容*/@PreAuthorize("hasAuthority('DOCUMENT_READ') and #documentId == authentication.principal.departmentId")public String getDocumentContent(Long documentId) {// 模拟从数据库获取文档内容return "Content of the document " + documentId;}}

12.3 控制器

创建一个控制器来处理文档访问请求。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DocumentController {@Autowiredprivate DocumentService documentService;@GetMapping("/documents/{documentId}")public ResponseEntity<String> getDocument(@PathVariable Long documentId) {return ResponseEntity.ok(documentService.getDocumentContent(documentId));}}

说明

  • 配置类:配置了Spring Security,并启用了方法级安全性,允许使用SpEL表达式来定义复杂的权限规则。
  • 业务逻辑: DocumentService 提供了获取文档内容的方法,该方法通过 @PreAuthorize 注解限制访问权限,使用SpEL表达式结合用户的角色和属性。
  • 控制器: DocumentController 提供了一个HTTP GET端点来获取文档内容。

13、安全上下文(Security Context)

业务场景: 一个多租户的SaaS应用程序,需要在每个请求中识别和处理当前认证用户的安全上下文,以确保用户只能访问其租户的数据。

业务时序图
在这里插入图片描述
1.用户(User) 尝试通过浏览器(Browser)访问一个受保护的资源。

2.浏览器(Browser) 向服务器(Server)发送 HTTP 请求

3.服务器(Server) 请求当前的安全上下文( SecurityContextHolder.getContext())。

4.安全上下文持有器(SecurityContextHolder) 提供当前的认证信息。

5.认证(Authentication) 对象检查用户是否有权访问请求的资源。

6.资源(Resource) 根据认证信息返回访问决策。

7.认证(Authentication) 根据需要更新安全上下文。

8.安全上下文持有器(SecurityContextHolder) 返回更新后的安全上下文。

9.服务器(Server) 根据安全上下文返回适当的响应给浏览器。

13.1 Spring Security 配置

首先,我们需要配置Spring Security以确保安全上下文在每个请求中正确处理。

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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
@Ena

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

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

相关文章

Python入门笔记(四)

文章目录 第九章 集合set9.1 创建集合&#xff1a;set()、集合生成式9.2 集合性质9.3 一些函数&#xff1a;issubset()、issuperset()、isdisjoint()9.4 集合增加元素&#xff1a;add()、update()9.5 集合删除元素&#xff1a;remove()、discard()、pop()、clear()9.6 创建不能…

用IntStream生成0到n的流,并找出不在numSet中的数字列表

这是用IntStream生成0到n的流&#xff0c;并找出不在numSet中的数字-CSDN博客的升级版 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 先看这题低…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变&#xff0c; 原来你笃定不会变的事&#xff0c;也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

Linux系统通过编辑crontab来设置定时任务---定时关机

在Linux系统中&#xff0c;crontab 是用来设置周期性被执行的指令的守护进程。通过编辑 crontab&#xff0c;您可以安排定时任务&#xff0c;比如定时关机、定时备份文件、定时运行脚本等。以下是如何编辑 crontab 来设置定时任务的步骤&#xff1a; 打开终端&#xff1a;您可以…

25.第二阶段x86游戏实战2-背包属性补充

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

k8s 1.28.2 集群部署 MinIO 分布式存储

文章目录 [toc]MinIO 介绍MinIO 生产硬件要求MinIO 存储要求MinIO 内存要求MinIO 网络要求MinIO 部署架构分布式 MinIO复制的 MinIO 部署 MinIO创建目录节点打标签创建 namespace创建 pv创建 MinIO配置 ingress问题记录通过代理服务器访问 MinIO 的 Object Browser 界面一直显示…

免费获取的8个SVG图标库,轻松下载与复制!

SVG图标相比传统的JPG、PNG图标具有诸多优势&#xff0c;适用于各种类型的图像&#xff0c;不仅能在不同尺寸下保持清晰度&#xff0c;还具备高度压缩性和轻量特性&#xff0c;支持静态和动态效果。因此&#xff0c;SVG格式在网页设计中往往是优选。尽管如今有很多免费的图标库…

微信小程序-APP-软件开发

微信小程序开发&#xff0c;作为当下移动互联网领域的一股强劲势力&#xff0c;正以其便捷性、轻量化及高用户粘性的特点&#xff0c;深刻改变着我们的生活与工作方式。它不仅为企业和个人开发者提供了一个全新的服务入口&#xff0c;更极大地拓宽了商业应用的边界。 在微信小…

python+request+unittest+ddt自动化框架

参考资料&#xff1a; 用户中心 - 博客园 抓包模拟器笔记 肖sir__接口自动化pythonrequestddt&#xff08;模版&#xff09; - xiaolehua - 博客园 pythonrequestunittestddt自动化框架 博文阅读密码验证 - 博客园 肖sir__python之模块configparser - xiaolehua - 博客园 c…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生&#xff1a; 最近开发项目的时候&#xff0c;遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候&#xff0c;有一个图片上传的接口&#xff0c;需要将byte[]转为MultipartFile 对象&#xff0c;但是发现根本没有这样的工具类&#xff0c;后面翻阅…

python list, tuple dict,set的区别 以及**kwargs 的基本用法

在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 定义: list:链表,有序的项目, 通过索引进行查找,使用方括号”[]”; tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”; dict:字典,字典是一组键(key)和值(value…

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系&#xff0c;帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…

【杭州马拉松:文化之旅,感受千年古城的魅力】

杭州马拉松&#xff0c;作为国内外知名的马拉松赛事&#xff0c;一直以来都以其独特的魅力和严谨的组织而备受瞩目。今年&#xff0c;杭马将于11月3日再次鸣枪起跑&#xff0c;为跑者们提供一个挑战自我、超越极限的舞台。赛事主办方在今年的比赛中引入了多项创新举措&#xff…

经典蓝牙BLE版本区别:【图文讲解】

蓝牙是一种短距的无线通讯技术&#xff0c;可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙&#xff0c;而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙&#xff08;BLE&#xff09;。 1&#xff1a;蓝牙4.0 BLE 4.0版本是3.0版本的升级版本&a…

20240904 华为笔试 二叉树消消乐

文章目录 题目解题思路代码BUG 代码最终代码题目 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中…

Tetra Pak利乐触摸屏维修beijer北尔触摸屏维修E1151

TetraPak利乐包装机触摸显示屏维修&#xff0c;北尔全系列型号触摸屏修理 维修注意事项&#xff1a; 上电前&#xff0c;应检查负载是否接上或是否正确&#xff1b; 测量电压时&#xff0c;确认档位是否在电压档。要确认仪器仪表的量程应大于测试点的电压&#xff1b; 更换电…

太速科技-607-基于FMC的12收和12发的光纤子卡

基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个CXP模块接口&#xff0c;提供12路收&#xff0c;12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议&#xff0c;可以组成X4&#xff0…

嵌入式学习-线性表Day05-双向链表

嵌入式学习-线性表Day05-双向链表 双向链表 操作函数 1&#xff09;创建一个空的双向链表 2&#xff09;双向链表中间插入 3)双向链表尾插 4&#xff09;双线链表中间删除 5&#xff09;双线链表删除最后一个节点 双向循环链表 双向链表 //双向链表的节点定义 typedef int dat…

力扣题11~20

题11&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 这种题目第一眼就是双循环&#xff0c;但是肯定不行滴&#xff0c;o(n^2)这种肯定超时&#xff0c;很难接受。 所以要另辟蹊径&#xff0c;我们先用俩指针&#xff08;标志位&#xff09;在最左端和最右端&am…

补图、同构图、自补图是什么意思

补图、同构图、自补图的解释网上很多文章写的不是很明确&#xff0c;所以我写一段小笔记记录一下。 同构图 同构图的数学定义为&#xff1a;给定两个图G(V,E)和G(V,E)&#xff0c;若存在一个双射函数f:V->V&#xff0c;使得对于任意的顶点u,v∈V&#xff0c;(u,v)∈E当且仅…