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

news2024/11/25 10:25:48

文章目录

  • 一、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 {
   

    @Override
    protected 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 {
   
    @Autowired
    private 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.coloradmin.cn/o/2207767.html

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

相关文章

Modnet 人像抠图(论文复现)

Modnet 人像抠图&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 Modnet 人像抠图&#xff08;论文复现&#xff09;论文概述论文方法复现WebUI部署 论文概述 人像抠图(Portrait matting)旨在预测一个精确的 alpha 抠图&#xff0c;可以用…

宠物浮毛的危害有哪些?适合养宠家庭的宠物空气净化器推荐!

上周有位患者来医院&#xff0c;他说自从养猫以来&#xff0c;喉咙有毛的感觉日益明显&#xff0c;吐也吐不出来&#xff0c;鼻子里也觉得充斥着毛毛&#xff0c;半夜呼吸的时候也时常受阻&#xff0c;现在一直咳嗽鼻塞。让他拍了片子后发现猫毛吸入肺部导致了肺炎。作为一位呼…

如何用ChatGPT 8小时写出一篇完整论文(附完整提示词)

今天教大家如何利用ChatGPT完成一篇完整的论文。只需要一个标题&#xff0c;剩下全部由ChatGPT完成。总耗时8小时。 阅前提醒&#xff1a; 1.适用人群&#xff1a;这个方法适合应付简单的学术任务&#xff0c;比如日常小论文或投稿一般期刊。但如果你要写高水平的论文&#xf…

【磁盘清理】linux df -h 命令不更新磁盘大小解决方法

centos-root df -h不更新磁盘大小 [rootkafka1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 238G 194G 44G 82% / devtmpfs 7.8G 0 7.8G 0% /dev tmpfs 7.8G 0 7.8G …

深度学习基础知识-01 数据操作

三维数组&#xff1a;通常用于表示单个图像&#xff0c;如&#xff08;高度&#xff0c;宽度&#xff0c;通道数&#xff09;。 四维数组&#xff1a;用于表示图像批次&#xff0c;如&#xff08;批次大小&#xff0c;高度&#xff0c;宽度&#xff0c;通道数&#xff09;。 五…

公开选拔!产业实践教授

产业实践教授&#xff0c;这一相对新兴的概念旨在通过产教融合方式促进高校与产业界的深度融合。 通常由来自产业界、拥有丰富实践经验的企业专家担任&#xff0c;承担特定教学任务和科研指导&#xff0c;或利用自身产业资源为学生提供实践机会和就业指导。 随着产教融合政策…

博睿数据Bonree ONE全面适配HarmonyOS NEXT,守护鸿蒙原生应用稳健前行

10月8日&#xff0c;华为官方正式宣布&#xff0c;华为HarmonyOS NEXT&#xff08;也被称作“纯血鸿蒙”&#xff09;系统开启公测&#xff0c;迎来国产系统里程碑一刻。作为IT运维监控和可观测性领域的领导者&#xff0c;博睿数据&#xff08;股票代码&#xff1a;688229&…

交叉熵损失 在PyTorch 中的计算过程

其实就是根据 真实值的结果&#xff0c;当成索引去取的值 import torch import torch.nn as nnaaaa torch.tensor([[2.0,1.0,3.0],[2.0,4.0,2.0]])l1 nn.LogSoftmax(dim-1) result l1(aaaa) print(result) import torch import torch.nn as nn# 定义交叉熵损失函数 criterio…

电影《荒野机器人》观后感

上上周看了电影《荒野机器人》&#xff0c;电影整体是比较偏向温馨的&#xff0c;通过动物与机器人视角&#xff0c;展现人类为情感。 &#xff08;1&#xff09;承载-托举-学习-感情 在电影中&#xff0c;有个场景让自己感觉特别温馨&#xff0c;就是机器人为了让大雁宝宝学习…

盛⽔最多的容器 04

盛⽔最多的容器 算法思想&#xff1a;对撞指针&#xff1a; 我写的代码&#xff1a; class Solution {public int maxArea(int[] height) {int left0;int rightheight.length-1;int minHight-1;//防止[2,0]这种特殊情况int maxV0;while(left<right) {if(height[left]>…

【hot100-java】随机链表的复制

链表篇 /* // Definition for a Node. class Node {int val;Node next;Node random;public Node(int val) {this.val val;this.next null;this.random null;} } */class Solution {public Node copyRandomList(Node head) {if(headnull){return null;}java.util.Map<Node…

三品PLM系统赋能中小企业实现数字化转型迈向管理智能化

在全球化的浪潮中&#xff0c;发达国家的企业在管理体系上更具优势&#xff0c;常采用先进的PLM体系提升运营和战略规划效率。相较之下&#xff0c;国内中小企业在PLM系统的应用上明显滞后&#xff0c;中高层管理人员普遍缺乏相应的认知与实践经验&#xff0c;这限制了企业的创…

面向车辆路线问题的泛化神经方法

文章目录 Abstract1 Introduction2 相关工作3 PreliminariesAbstract 学习车辆路径问题(VRPs)的启发式方法由于减少了对手工制定规则的依赖而受到了广泛关注。然而,现有的方法通常在具有固定大小和节点分布的同一任务上进行训练和测试,因此在泛化性能上受到限制。本文研究…

权威骨传导耳机测评分享!2024骨传导耳机推荐榜单大盘点!

骨传导耳机的概念就是针对传统入耳式的不足创新出来的。配戴方式一般为夹耳式和挂耳式&#xff0c;配戴舒适性极高&#xff0c;不堵耳&#xff0c;不涨耳&#xff0c;不伤耳且稳固性非常好。特别适合运动健身&#xff0c;办公通勤等需要长久配戴的场景。 作为一个运动爱好者&a…

携手申威合力筑牢数字之基!麒麟信安参加申威产品发布暨申威产业发展联盟大会

9月20日&#xff0c;申威产品发布暨申威产业发展联盟大会在无锡成功召开&#xff0c;会上&#xff0c;申威新一代服务器处理器威鑫H8000及配套芯片、基础软件等新品集中首发&#xff0c;麒麟信安作为申威产业发展联盟成员单位&#xff0c;与院士专家、政府领导、科研院校、联盟…

125页满分PPT | 数据架构革新顶层规划方案

数据架构的重要性 数据架构规划是确保企业数据战略成功实施的基础。它不仅涉及数据的组织和管理&#xff0c;还关系到数据的价值实现。良好的数据架构规划可以帮助企业实现数据标准化、提高数据质量、保障数据安全&#xff0c;并最终推动业务创新和提升客户服务水平。本文重点展…

【C++篇】继承之韵:解构编程奥义,感悟面向对象的至高法则

文章目录 C 继承详解&#xff1a;初阶理解与实战应用前言第一章&#xff1a;继承的基本概念与定义1.1 继承的概念1.2 继承的定义 第二章&#xff1a;继承中的访问权限2.1 基类成员在派生类中的访问权限2.2 基类与派生类对象的赋值转换2.2.1 派生类对象赋值给基类对象2.2.2 基类…

Spark练习-RDD创建,读取hdfs上的数据,指定rdd分区

目录 RDD的创建 读取HDFS上文件数据 RDD分区指定 RDD的创建 将python数据转为rdd # 将Python数据转为rdd data [1,2,3,4] res sum(data) # 使用python的方法计算时&#xff0c;采用的单机资源计算&#xff0c;如果数据量较大时&#xff0c;可以将python数据转为spark的r…

QD1-P2 HTML 编辑器:HBuilderX

本节学习&#xff1a; HTML课程内容介绍HBuilderX编辑器的使用 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p2 HTML 内容 基础语法 标签整体架构DOCTYPE 常用标签 标题和水平线段落和换行列表div 和 span格式化标签图片超链接标签表格表单字符实体 编辑器 HBuilder…

C/C++逆向:函数逆向分析-总体流程(整型指针)

函数的初始化 在逆向工程中&#xff0c;函数的初始化操作是函数在开始执行时&#xff0c;为正确运行而进行的准备工作。通常&#xff0c;这些操作发生在函数的序言&#xff08;Prologue&#xff09;阶段&#xff0c;具体的内容和顺序会因编译器、调用约定和目标平台&#xff0…