Spring Security 基础配置详解(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 实战

前言

基本的Java知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

1. 基本知识

HttpSecurity 是 Spring Security 的核心类之一,负责配置基于 HTTP 的安全性,提供了用于定义安全规则、身份验证、授权、会话管理、跨站请求伪造(CSRF)保护等一系列功能的 API

HttpSecurity 主要知识点

功能方法说明
认证机制配置.authorizeRequests()用于定义请求的访问权限规则。例如,哪些 URL 需要认证,哪些允许匿名访问
禁用 CSRF 保护.csrf().disable()CSRF 是跨站请求伪造,默认启用。可以使用此方法禁用它
跨域资源共享(CORS).cors()允许配置跨域请求处理。通常用于解决跨域资源共享问题
表单登录.formLogin()使用表单认证方式,配置登录页面、登录处理 URL 等
HTTP Basic 认证.httpBasic()使用 HTTP Basic 认证方式,在每个请求的 Authorization 头中传递凭据
会话管理.sessionManagement()定义会话的管理方式,比如会话超时、是否创建新会话、并发会话控制等
记住我功能.rememberMe()允许用户通过“记住我”功能进行持久化登录
异常处理.exceptionHandling()配置访问被拒绝时的处理器或未登录时的处理行为
用户登出.logout()配置登出功能,包括登出 URL、清除 Cookie、登出成功后的跳转页面等
自定义过滤器.addFilter() / .addFilterBefore() / .addFilterAfter()添加自定义过滤器,可以在指定的过滤器链中插入额外的处理逻辑
禁用默认的头部配置.headers().disable()禁用默认的安全头部配置,例如 X-Content-Type-Options、X-Frame-Options 等
强制 HTTPS.requiresChannel()配置强制 HTTPS 的通道安全

基本的一个配置过程如下:

  1. 身份验证和授权:通过 .authorizeRequests() 设置每个 URL 的访问权限
  2. 会话管理:使用 .sessionManagement() 管理会话行为,包括并发会话和超时
  3. 异常处理:通过 .exceptionHandling() 定义未授权请求的处理逻辑
  4. 跨域配置:使用 .cors() 和 .csrf() 设置跨域和跨站请求伪造保护
  5. 自定义过滤器:通过 .addFilter() 方法插入自定义过滤器,以实现更多灵活的安全控制

2. Demo

给一个基本的Demo复杂场景示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http// 1. 禁用 CSRF 保护(根据需要禁用).csrf().disable()// 2. 开启 CORS 支持.cors().and()// 3. 配置授权规则.authorizeRequests()// 允许静态资源和主页访问.antMatchers("/", "/home", "/css/**", "/js/**").permitAll()// 需要用户登录的请求.antMatchers("/user/**").authenticated()// 只允许 ADMIN 角色访问的请求.antMatchers("/admin/**").hasRole("ADMIN")// 所有其他请求需要认证.anyRequest().authenticated()// 4. 表单登录配置.and().formLogin().loginPage("/login")               // 自定义登录页面.loginProcessingUrl("/perform_login") // 登录表单提交 URL.defaultSuccessUrl("/home", true)    // 登录成功后跳转的默认页面.failureUrl("/login?error=true")    // 登录失败后跳转的页面.permitAll()                        // 允许所有人访问登录页面// 5. 记住我功能.and().rememberMe().key("uniqueAndSecret")             // rememberMe 的密钥.tokenValiditySeconds(86400)        // token 有效期 1 天// 6. HTTP Basic 认证.and().httpBasic()                             // 启用 HTTP Basic 验证// 7. 配置登出功能.and().logout().logoutUrl("/perform_logout")        // 自定义登出 URL.deleteCookies("JSESSIONID")         // 删除 session ID 的 cookie.logoutSuccessUrl("/login?logout")   // 登出成功后跳转页面.permitAll()// 8. 配置异常处理.and().exceptionHandling().accessDeniedPage("/403")            // 无权限时跳转到 403 页面// 9. 会话管理.and().sessionManagement().maximumSessions(1)                  // 限制最多 1 个并发会话.maxSessionsPreventsLogin(true);     // 超过限制时不允许再次登录}
}

3. 实战

为更好的展示案例,以JimuReport报表为例

在这里插入图片描述

详细分析其代码含义:

@Configuration
@EnableWebSecurity // 启用 Spring Security 的Web安全功能
public class SpringSecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {// 禁用 CSRF 保护http.csrf().disable().authorizeRequests() // 开始定义请求的授权规则// 允许所有人访问登录相关的请求.antMatchers("/login/**").permitAll()// 允许访问静态资源,放行相关路径.antMatchers("/jmreport/**/cdn/**", // CDN 资源"/jmreport/desreport_/**/*.js", // JavaScript 文件"/jmreport/desreport_/**/*.css", // CSS 文件"/jmreport/desreport_/**/*.png") // PNG 图片.permitAll()// 允许访问无需登录的接口.antMatchers("/jmreport/excelQueryByTemplate", // 模板查询接口"/jmreport/img/**", // 图片接口"/jmreport/download/image", // 下载图片接口"/jmreport/verificationToken", // 验证令牌接口"/jmreport/link/queryByIds", // 查询链接的接口"/jmreport/test/getUserMsg", // 获取用户信息接口"/jmreport/test/getOrder", // 获取订单接口"/jmreport/auto/export/download/**") // 导出下载接口.permitAll()// 允许访问分享页面相关接口.antMatchers("/jmreport/shareView/**", // 分享视图"/jmreport/checkParam/**", // 检查参数"/jmreport/share/verification", // 分享验证"/jmreport/getQueryInfo", // 获取查询信息"/jmreport/show", // 显示接口"/jmreport/addViewCount/**") // 增加访问量接口.permitAll()// 允许访问 view 页面,使用自定义访问控制逻辑.antMatchers("/jmreport/view/**").access("@viewPageCustomAccess.check(request,authentication)")// 任何其他请求必须经过身份验证.anyRequest().authenticated().and()// 配置表单登录.formLogin().loginPage("/login/login.html") // 自定义登录页面.loginProcessingUrl("/login") // 登录请求处理的 URL.successHandler(new CustomLoginSuccessHandler()) // 登录成功处理器.permitAll() // 允许所有人访问登录页面.and()// 配置登出.logout().invalidateHttpSession(true) // 登出时无效化 HTTP 会话.clearAuthentication(true) // 清除认证信息.permitAll(); // 允许所有人访问登出功能return http.build(); // 构建 SecurityFilterChain}
}

另外一个实战代码示例:

@Bean
protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {// 开启跨域保护httpSecurity// 开启跨域资源共享(CORS).cors().and()// 禁用 CSRF(因为不使用 Session 机制,使用 Token 验证).csrf().disable()// 配置 Session 管理为无状态,因为基于 Token 机制,不需要会话.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()// 关闭浏览器框架选项(防止点击劫持).headers().frameOptions().disable().and()// 配置自定义的异常处理器.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint) // 处理未认证用户的访问异常.accessDeniedHandler(accessDeniedHandler); // 处理已认证用户的访问权限异常// 使用自定义的登录机制,不依赖 Spring Security 自带的登录逻辑// 登录暂时不使用 Spring Security 的扩展点,以减少复杂度和用户学习成本// 获取 @PermitAll 注解标注的 URL 列表,这些 URL 免登录Multimap<HttpMethod, String> permitAllUrls = getPermitAllUrlsFromAnnotations();// 配置请求权限httpSecurity// 定义授权规则.authorizeRequests()// ① 全局共享规则// 1.1 静态资源可以匿名访问.antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll()// 1.2 设置 @PermitAll 标注的接口无需认证.antMatchers(HttpMethod.GET, permitAllUrls.get(HttpMethod.GET).toArray(new String[0])).permitAll().antMatchers(HttpMethod.POST, permitAllUrls.get(HttpMethod.POST).toArray(new String[0])).permitAll().antMatchers(HttpMethod.PUT, permitAllUrls.get(HttpMethod.PUT).toArray(new String[0])).permitAll().antMatchers(HttpMethod.DELETE, permitAllUrls.get(HttpMethod.DELETE).toArray(new String[0])).permitAll()// 1.3 基于配置文件中的 permit-all-urls,无需认证.antMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll()// 1.4 设置应用 API(如 `/app/api/**`),无需认证.antMatchers(buildAppApi("/**")).permitAll()// 1.5 验证码接口允许匿名访问.antMatchers("/captcha/get", "/captcha/check").permitAll()// ② 各个模块的自定义规则(通过 registry 定制).and().authorizeRequests(registry -> authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(registry)))// ③ 兜底规则,其他请求必须认证.authorizeRequests().anyRequest().authenticated();// 在 UsernamePasswordAuthenticationFilter 前添加 Token 过滤器,用于 Token 验证httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);// 返回配置好的 SecurityFilterChainreturn httpSecurity.build();
}

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

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

相关文章

51单片机快速入门之 LCD1602 液晶显示屏2024/10/19

51单片机快速入门之 LCD1602 液晶显示屏 Proteus 电路图 : 74HC595 拓展电路可以不用,给 p0-p17 添加上拉电阻也可以!,我这里是方便读取和节省电阻线路 (因为之前不知道 在没有明确循环的情况下&#xff0c;Keil编译器可能会在main()中自动添加类似以下的汇编代码&#xff1a…

ChatGPT Plus 升级全攻略

ChatGPT Plus 升级全攻略 最近有很多人想知道如何顺利升级到 ChatGPT Plus。这里有详细步骤,确保你不会错过任何环节。 第一步:登录 OpenAI 首先,你需要去 chat.openai.com。 然后,点击“登录”,输入你的邮箱和密码。 接下来,确保你输入的信息是正确的。 第二步:点击“升级…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

软件测试工程师:如何写出好的测试用例?

软件测试用例(Test Case)是软件测试过程中的一种详细文档或描述&#xff0c;用于描述在特定条件下&#xff0c;对软件系统或组件进行测试的步骤、输入数据、预期输出和预期行为。编写高质量的测试用例是确保软件质量的关键步骤之一。以下是一些编写优秀测试用例的建议&#xff…

StarRocks产品简介

StarRocks概念 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;就可以用 StarRocks 来支持多种数据分析场景的极速分析。 StarRocks架构 Star…

使用Arcgis批量自动出图

操作方法如下&#xff1a; 1 2 3 4 5 6 7 设置好选项&#xff0c;开始打印。 8 生成pdf。 第一步&#xff1a;shp放到数据库中&#xff0c;标注转注记&#xff0c;然后编辑注记&#xff0c;符号样式设置好。准备出图&#xff1a;&#xff08;转注记时候尽量压盖监测等选最…

MXO44-2410数字示波器

MXO44-2410数字示波器 R&SMXO 4 系列是新一代示波器的首款产品&#xff0c;在性能和价值方面均表现出色。这些仪器提供十年一遇的工程突破&#xff0c;以加速洞察。 它们具有世界上最快的 450 万波形/秒的实时更新速率&#xff0c;这意味着工程师可以看到比任何其他仪器更…

李宏毅机器学习2022-HW7-BERT-Question Answering

文章目录 TaskBaselineMediumStrongBoss Code Link Task HW7的任务是通过BERT完成Question Answering。 数据预处理流程梳理 数据解压后包含3个json文件&#xff1a;hw7_train.json, hw7_dev.json, hw7_test.json。 DRCD: 台達閱讀理解資料集 Delta Reading Comprehension …

react 中的hooks中的useState

(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2). 语法: const [xxx, setXxx] React.useState(initValue) (3). useState()说明:参数: 第一次初始化指定的值在内部作缓存返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的…

jmeter用csv data set config做参数化1

在jmeter中&#xff0c;csv data set config的作用非常强大&#xff0c;用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下&#xff1a; Variable Names处&#xff0c;写上源文件中的参数名&#xff0c;用于后续接口发送请求时引用 Ignore first line…

【Linux】waitpid函数 及其 非阻塞等待和阻塞等待

父进程等待子进程结束可以通过两种方式实现&#xff1a;阻塞等待和非阻塞等待。这两种方式各有优缺点&#xff0c;适用于不同的场景。 简单来说&#xff1a; 阻塞等待&#xff1a;先等你&#xff0c;我再继续 非阻塞等待&#xff1a;不等你&#xff0c;我继续做自己的事&…

初识适配器模式

适配器模式 引入 生活中的例子&#xff1a;当我们使用手机充电时&#xff0c;充电器起到了转换器的作用&#xff0c;它将家用的220伏特电压转换成适合手机充电的5伏特电压。 适配器模式的三种类型 命名原则&#xff1a;适配器的命名应基于资源如何传递给适配器来进行。 类适配…

Web架构演变历程~

1、背景 对于服务架构&#xff0c;这个名词大家应该都很熟悉了吧&#xff0c;一个好的架构并不是一个最合适的架构&#xff0c;在对于选择那种架构&#xff0c;对于一个项目后续发展致关重要&#xff0c;接下来我们一起走进web服务架构的演变历程看看吧&#xff01; 2、服务架…

基于STM32F407VGT6芯片----跑马灯实验

一、在STM32F407VGT6芯片中配置GPIO环境 对于一个跑马灯实验&#xff0c;首先&#xff0c;要了解的就是&#xff0c;芯片是如何构造出来的&#xff0c;设计GPIO引脚&#xff1a;根据原理图&#xff0c; PC4&#xff0c;PC5,PC6,PC7 为 LED 输出控制管脚&#xff0c;PE0 为蜂鸣…

Spring Boot视频网站:安全与可扩展性设计

4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

SpringDataRedis快速入门

SpringDataRedis 什么是SpringDataRedis SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis SpringDataRedis中提供了RedsiTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类…

Atlas800昇腾服务器(型号:3000)—YOLO全系列NPU推理【检测】(五)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

YOLOv11模型改进-注意力机制-引入自适应稀疏自注意力ASSA

随着目标检测领域的快速发展&#xff0c;YOLO系列模型凭借其端到端、高效的检测性能逐渐成为工业界和学术界的标杆。然而&#xff0c;如何进一步优化YOLOv11的特征提取能力&#xff0c;减少冗余信息并提升模型对复杂场景的适应性&#xff0c;仍是一个值得深入探讨的问题。为此&…

Atlas800昇腾服务器(型号:3000)—驱动与固件安装(一)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单&#xff0c;根据url来处理翻页&#xff0c;然后获取到详情页面的链接&#xff0c;再去爬取详情页面的内容即可&#xff0c;最终数据落地到excel中。 经测试&#xff0c;总计获取 11299条中医药材数据。 import pandas as…