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

news2024/11/22 8:45:19

文章目录

  • 一、Spring Security 常用应用场景介绍
  • 二、Spring Security场景案例
    • 1、认证(Authentication)
      • 1.1. Spring Security 配置
      • 1.2 业务逻辑代码
      • 1.3 登录控制器
      • 1.4 登录页面 (login.html)
    • 2、授权(Authorization)
      • 2.1 Spring Security 配置
      • 2.2 业务逻辑代码
      • 2.3 控制器
    • 3、表单登录(Form-Based Login)
      • 3.1 Spring Security 配置
      • 3.2 登录控制器
      • 3.3 登录页面 (login.html)
      • 3.4 Home页面 (home.html)
      • 3.5 配置静态资源
    • 4、HTTP 基本认证(HTTP Basic Authentication)
      • 4.1 Spring Security 配置
      • 4.2 业务逻辑代码
      • 4.3测试HTTP基本认证
    • 5、OAuth2 和 OpenID Connect
      • 5.1 Spring Security 配置
      • 5.2 业务逻辑代码

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场景案例

1、认证(Authentication)

业务场景: 一个在线书店系统,用户需要登录后才能查看订单和购买书籍。
业务时序图
在这里插入图片描述
1.用户(User) 访问登录页面。

2.表单登录认证过滤器(FormLoginAuthenticationFilter) 显示登录表单。

3.用户填写凭据并提交。

4.表单登录认证过滤器(FormLoginAuthenticationFilter) 调用 认证管理器(AuthenticationManager) 的 attemptAuthentication 方法。

5.认证管理器(AuthenticationManager) 请求 用户详细信息服务(UserDetailsService) 根据用户名加载用户信息。

6.用户详细信息服务(UserDetailsService) 调用自定义的 CustomUserDetailsService 获取用户详细信息。

7.CustomUserDetailsService 返回用户详细信息给 认证管理器(AuthenticationManager) 。

8.认证管理器(AuthenticationManager) 请求 密码编码器(PasswordEncoder) 对用户输入的密码进行编码。

9.密码编码器(PasswordEncoder) 将编码后的密码与存储的密码进行比较。

10.认证管理器(AuthenticationManager) 根据比较结果决定认证是否成功。

11.表单登录认证过滤器(FormLoginAuthenticationFilter) 根据认证结果重定向用户到主页或显示错误。

12.认证信息被设置到 SecurityContextHolder 中。

1.1. Spring Security 配置

首先,我们需要配置Spring Security来处理用户的登录请求。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
   
  @Override
  protected void configure(HttpSecurity http) throws Exception {
   
        http       
			.authorizeRequests()           
				.antMatchers("/login", "/register").permitAll()
                .anyRequest().authenticated()
			.and()
            .formLogin()
				.loginPage("/login")               
				.defaultSuccessUrl("/home", true)                
				.permitAll()            
			.and()            
			.logout()               
				.permitAll();    
	}

	@Override    
	protected void configure(AuthenticationManagerBuilder auth) throws Exception{
   
        auth           
			.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
         .and()
         .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
  }
 
	@Bean    
	public PasswordEncoder passwordEncoder() {
   
    	return new BCryptPasswordEncoder();
    }
}

1.2 业务逻辑代码

接下来,我们创建一个服务来处理用户的登录逻辑。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

@Service
public class AuthService {
   

    @Autowired    
	private AuthenticationManager authenticationManager;

   /**
     * 用户登录方法
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录成功返回 true,否则返回 false
     */

    public boolean authenticateUser(String username, String password) {
   

       try {
   
            // 调用 Spring Security 的认证管理器进行认证
            Authentication authentication = authenticationManager
                .authenticate(new UsernamePasswordAuthenticationToken(username,password));

            // 将认证信息放入安全上下文中
            authenticationManager.authenticate(authentication);

            // 认证成功
            return true;
        } catch (Exception e) {
   
            // 认证失败
            return false;
        }
    }
}

1.3 登录控制器

最后,我们需要一个控制器来处理用户的登录请求。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LoginController {
   

    @GetMapping("/login")
    public String login() {
   
        return "login";
    }

   @GetMapping("/home")
    public String home()

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

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

相关文章

如何判断静态代理IP地址是否被污染?

在网络使用中,静态IP代理是一种常见的工具,用于维持稳定的连接和保护个人隐私。然而,有时这些IP地址可能会被污染,导致用户遭受各种问题,如连接延迟、数据泄露等。因此,了解如何判断址是否被污染至关重要。…

EPC User Manual Introduction

Overview 您提供的链接是指向srsRAN 4G项目的官方文档,具体是关于srsEPC的介绍部分。以下是该页面的核心内容概要: ### 概述 srsEPC是一个轻量级的完整LTE核心网络(EPC)实现。srsEPC应用程序作为一个单一的二进制文件运行&#…

【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!二叉搜索树 大家好,这里是店小二!今天我们将深入探讨高阶数据结构中的AVL树。AVL树是一种自平衡的二叉搜索树,可以看作是对传统二叉搜索树的优化版本。如果你对数据结…

828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接

营运版的即时通讯IM聊天交友系统:特点可发红包,可添加多条链接到用户网站和应用,安卓苹果APPPC端H5四合一 后端开发语言:PHP, 前端开发语言:uniapp混合开发。 集安卓苹果APPPC端H5四合一APP源码&#xff0…

AI学习记录 - L2正则化详细解释(权重衰减)

大白话: 通过让反向传播的损失值变得比原来更大,并且加入的损失值和权重的大小有关,当出现权重的平方变大的时候,也就是权重往更加负或者更加正的方向走的时候,损失就越大,从而控制极大正或者极大负的情况…

在宝塔面板中部署 Express + MongoDB + Uniapp h5 项目(超详细!!!)

文章目录 一、打包 uniapp h5 项目(1) 打开 manifest.json 文件,修改相关配置(2) 开始项目打包 二、修改 express 相关配置(1) 添加打包后的前端资源文件(2) 修改 app.js 文件(3) 修改项目启动命令 三、使用宝塔面板部署项目(1) 宝塔面板安装(2) 项目环境搭建 四、添…

之前各种炸裂的Flux更新了Flux1.1 pro,效果会不会依然“炸裂”呢?

🐠更新内容 Black Forest Labs,也就是黑森林工作室在国庆期间更新了新的模型,Flux1.1 Pro,官方公告大家也可以参考: announcements. - Black Forest Labs 那么这次更新主要讲了什么呢? FLUX1.1 [pro]&am…

系统架构设计师-下午案例题(2018年下半年)

1.某文化产业集团委托软件公司开发一套文化用品商城系统,业务涉及文化用品销售、定制、竞拍和点评等板块,以提升商城的信息化建设水平。该软件公司组织项目组完成了需求调研,现已进入到系统架构设计阶段。考虑到系统需求对架构设计决策的影响,项目组先列出了可能影响系统架…

企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)

EHR人力资源管理系统是现代企业提升人力资源管理效率的重要工具。该系统集成了多个功能模块,旨在实现人力资源管理的全面数字化和自动化。以下是对EHR系统主要功能的剖析,包括组织架构、人事管理、考勤管理、薪资管理、绩效管理、档案管理、招聘管理、培…

如何写出更系统的验证检查器

前言 芯片验证是为了发现芯片中的错误而执行的过程,它是一个破坏性的过程。有效激励灌入待测模块后,需要判断出不符合功能描述的行为。检查器(Checker)就是用于查看待测模块是否按照功能描述文档做出期望的行为,识别出所有的设计缺陷。 不同…

【PostgreSQL】PG数据库表“膨胀”粗浅学习

文章目录 1 为什么需要关注表膨胀?2 如何确定是否发生了表膨胀?2.1 通过查询表的死亡元组占比情况来判断膨胀率2.1.1 指定数据库和表名2.1.2 查询数据库里面所有表的膨胀情况 3 膨胀的原理3.1 什么是膨胀?膨胀率?3.2 哪些数据库元…

服贸会上的科技闪耀之星:璞华易研PLM系统引领产品研发潮流

2024年中国国际服务贸易交易会(以下简称为“服贸会”)于9月在北京盛大开幕,再次汇聚全球目光,共襄智慧服务的盛宴。本届服贸会秉承“全球服务、互惠共享”的核心理念,聚焦“共享智慧服务,共促开放发展”&am…

计算机毕业设计 基于Python的社交音乐分享平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【路径规划】A*(A星)搜索路径规划教程

摘要 A算法是一种用于图形搜索的启发式搜索算法,广泛应用于路径规划、游戏AI和机器人导航等领域。本教程将深入介绍A算法的理论基础,展示其在路径规划中的应用,并通过Matlab代码实现A*算法的实际运行。同时,我们将结合实验结果进…

qsort函数及其使用的方法分解讲解

qsort函数 默认排序升序 void qsort(void* base,//指向待排序数组的第一个元素的地址 size_t num,//base指向数组中元素的个数 size_t size,//base指向的数组中一个元素的大小,单位是字节 int (*compar)(const void*,const void*…

YOLO11改进|卷积篇|引入线性可变形卷积LDConv

目录 一、【LDConv】卷积1.1【LDConv】卷积介绍1.2【LDConv】核心代码 二、添加【LDConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LDConv】卷积 1.1【LDConv】卷积介绍 下图是【LDCNV】的结构图,让我们简单分析…

Mysql高级篇(下)——主从复制

主从复制 一、概述二、作用🎈 场景示例🎈 综合示例 三、原理🎈 主从复制基本原则🎈 主从复制存在的问题 四、一主一从架构搭建🌱准备工作🌞步骤1. 配置主库(Master)2. 配置从库&…

如何搭建基于大模型的智能知识库

自从2022年底ChatGPT横空出世引爆了大模型技术浪潮,时至今日已经一年有余,如何从技术侧向商业侧落地转化是一直以来业内普遍关注的问题。 从目前企业端观察到的情况来看,基于大模型的知识库是一个比较有潜力和价值的应用场景,能够…

落伍警告:不了解AI Agent,你可能会被编程界淘汰

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI…

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode,My_HUD,My_PlayChar,My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机,角色骨骼网格体,武器骨骼网格体 编辑角色骨骼,预览控制器使用特定动画,动画选择ANM_ark-47-Idle hand_r 添加插槽WeaponMes…