使用 Spring Security的一些常用功能

在实际开发中,Spring Security 常常涉及一些常用的功能。以下是一些在开发中经常使用的 Spring Security 功能:

1. PasswordEncoder Bean(密码加密)

这段配置使用 BCryptPasswordEncoder 作为密码加密算法。它是 Spring Security 中常用的密码加密方式,通常用于存储和验证用户的密码。

@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}

2. 跨域配置(CORS)

配置跨域请求源、请求方法和请求头,允许前端应用跨域访问后端接口。该功能在前后端分离的应用中非常常见,尤其是需要不同域名访问同一服务时。

@Bean
public CorsConfigurationSource configurationSource() {UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.setAllowedOrigins(Arrays.asList("*"));corsConfiguration.setAllowedMethods(Arrays.asList("*"));corsConfiguration.setAllowedHeaders(Arrays.asList("*"));urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);return urlBasedCorsConfigurationSource;
}

3. 自定义登录页面和失败处理

配置自定义的登录页面以及登录成功和失败时的处理逻辑。这是常见的安全性需求,尤其是在用户体验中需要提供定制的登录界面。

.formLogin(formLogin -> {formLogin.loginProcessingUrl("/login").successHandler(myAuthenticationSuccessHandler).failureHandler(myAuthenticationFailHandler);
})

 一般在登录成功的回调的处理器当中,我们会生成token并且存入Redis当中,在后续的拦截器当中从Redis获取token并且认证

4. 自定义登出处理

配置自定义的退出登录 URL 及退出成功后的处理。通常需要在登出成功后清理用户会话或进行其他操作。

.logout(logout -> {logout.logoutUrl("/logout").logoutSuccessHandler(myLogoutSuccessHandler);
})

5. 请求授权(授权控制)

配置不同的 URL 路径的访问权限,允许一些 URL 对所有用户开放(如登录页面、验证码等),并限制其他 URL 需要认证才能访问。

.authorizeHttpRequests(authorizeHttpRequests -> {authorizeHttpRequests.requestMatchers("/toLogin", "/common/captcha").permitAll().anyRequest().authenticated();
})

6. 禁用 CSRF(跨站请求伪造)保护

禁用 CSRF 防护,通常在使用无状态认证(如 JWT)时需要禁用 CSRF,因为它依赖于会话。

.csrf(csrf -> {csrf.disable();
})

7. Session 管理

设置无状态的会话管理,即不创建会话,每次请求都需要进行身份认证。通常配合 JWT 使用。

.sessionManagement(sessionManagement -> {sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
})

8. Token 过滤器

在 Spring Security 的过滤器链中加入自定义的 Token 过滤器(通常用于验证 JWT),确保每个请求都携带正确的认证信息。

对于 RESTful API 和前后端分离的应用,JWT 是一种常见的认证方式。Spring Security 可以与 JWT 配合使用来实现无状态认证。

你可以在 Spring Security 配置中添加一个 JWT 过滤器,拦截请求,提取 JWT 并进行认证。

示例:

 // 在登录filter 之后添加一个token过滤器 确保退出登录的时候可以获取到认证信息.addFilterBefore(tokenFilter, LogoutFilter.class)

tokenFilter:

@Component
public class TokenFilter  extends OncePerRequestFilter {@Resourceprivate RedisTemplate<String, String> redisTemplate;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {response.setContentType("application/json;charset=UTF-8");// 获取请求路径String requestURI = request.getRequestURI();// 判断是否是登录请求 登录请求不需要验证if (requestURI.equals("/login")) {filterChain.doFilter(request, response);} else {// 取出请求头中的tokenString token = request.getHeader("token");// 判断token是否有内容if (!StringUtils.hasText(token)) {// 没有值R result = R.builder().code(901).msg("token不能为空").build();response.getWriter().write(JSONUtil.toJsonStr(result));} else {boolean verify = false;try {// 验证通过了为true  这里需要捕获异常verify = JWTUtil.verify(token, Constant.JWT_SECRET.getBytes());} catch (Exception e) {e.printStackTrace();}if (!verify) {// token无效R result = R.builder().code(902).msg("token无效").build();response.getWriter().write(JSONUtil.toJsonStr(result));} else {JSONObject payload = JWTUtil.parseToken(token).getPayloads();String userJson = payload.get("user", String.class);TUser tUser = JSONUtil.toBean(userJson, TUser.class);if (!token.equals(redisTemplate.opsForValue().get(Constant.REDIS_TOKEN_PREFIX + tUser.getId()))) {R result = R.builder().code(903).msg("请求token错误").build();response.getWriter().write(JSONUtil.toJsonStr(result));} else {// 验证通过了,要在Spring Security的上下文当中需要防止一个认证对象// 这样的话 Spring Security 在执行后续的Filter的时候,才知道这个人是已经登录了的UsernamePasswordAuthenticationToken authenticationToken= new UsernamePasswordAuthenticationToken(tUser, null, tUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);// 放行filterChain.doFilter(request, response);}}}}}
}

需要注意的是当验证通过了之后,需要设置Authentication 认证对象, UsernamePasswordAuthenticationToken 是其一个实现类。

9. 访问权限拒绝处理

配置权限不足时的处理逻辑,通常用来返回友好的错误信息或页面。

.exceptionHandling(exceptionHandling -> {exceptionHandling.accessDeniedHandler(myAccessDeniedHandler);
})

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

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

相关文章

FPGA_YOLO(二)

上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…

Windows系统安装Node.js和npm教程【成功】

0.引言——Node.js和npm介绍 项目描述Node.js基于Chrome V8引擎的JavaScript运行环境&#xff0c;使JavaScript可用于服务器端开发。采用单线程、非阻塞I/O及事件驱动架构&#xff0c;适用于构建Web服务器、实时应用和命令行工具等npmNode.js的包管理器与大型软件注册表。拥有…

使用外部事件检测接入 CDH 大数据管理平台告警

CDH 大数据管理平台 CDH&#xff08;Cloudera Distribution Hadoop&#xff09;是一个企业级的大数据平台&#xff0c;由 Cloudera 公司提供&#xff0c;它包含了 Apache Hadoop 生态系统中的多种开源组件&#xff0c;并对其进行了优化和集成&#xff0c;以支持大规模数据存储…

Node.js的安装和环境配置

漂亮女同事想了解Node.js的安装和环境配置。首先&#xff0c;我说需要回忆一下自己安装Node.js的经历&#xff0c;确保步骤是正确的。可能用户是刚接触开发的新手&#xff0c;所以需要详细但清晰的指导。 首先&#xff0c;应该介绍Node.js是什么&#xff0c;不过用户可能已经知…

在普通用户下修改root用户密码

1 从普通用户切换到root用户 sudo -s 再输入密码。 2 输入passwd ,会提醒你输入当前用户密码&#xff0c;验证后会提醒你输入root用户密码。 3 切换到root用户&#xff0c;使用修改过的密码登陆。 4 成功进入root用户。

【#2】介绍第三方库

一、JsonCpp 库 &#x1f525; JSONCPP 是一个开源的 C 库&#xff0c;用于解析和生成 JSON&#xff08;JavaScript Object Notation&#xff09;数据。它提供了简单易用的接口&#xff0c;支持 JSON 的序列化和反序列化操作&#xff0c;适用于处理配置文件、网络通信数据等场…

Qt开发:QInputDialog的使用

文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类&#xff0c;用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…

SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测

SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测 目录 SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【SCI一区级】Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测&#xff08;程…

Vulnhub-Thales通关攻略

第0步&#xff1a;网卡配置 靶机端&#xff1a;将下载好的靶机环境&#xff0c;导入 VritualBox&#xff0c;设置为 Host-Only 模式 Kali端&#xff1a;将 VMware 中桥接模式网卡设置为 VritualBox 的 Host-only 第一步&#xff1a;确定靶机IP #靶机IP 192.168.56.101#KaliIP 1…

JVM 02

今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载&#xff08;Loading&#xff09; 通过类全限定名获取类的二进制字节流&#xff08;如从JAR包、网络、动态…

Python学习笔记(7)关于列表创建,增加,删除

列表 **Python中一切都是对象 存放多个值的连续内存空间 大小可变 增加元素 a a[50]#➕运算符操作&#xff0c;产生了新对象 list.append(x) #将元素x增加至list尾部 list.extend(alist) #将列表alist增加至list尾部 list.insert(index.x) #将元素x插入list指定index位置 …

【图片识别Excel表格】批量将图片上的区域文字识别后保存为表格,基于WPF和阿里云的项目实战总结

一、项目背景 在信息处理和文档管理中,经常会遇到需要从大量图片中提取文字并进行整理的场景。例如,财务部门需要从大量报销票据中提取金额、日期等信息;法务部门需要从合同文档中提取关键条款;教育行业需要从试卷中提取学生的答题内容等。传统的手工处理方式不仅耗时长、…

【C语言】文件操作(详解)

个人主页 今天我们来讲一下有关文件的相关操作&#xff0c;希望看完这篇文章对你有所帮助&#xff0c;大力感谢你对博主的支持&#xff01; 文章目录 ⭐一、为什么使用文件&#x1f389;二、什么是文件2.1 程序文件2.2 数据文件2.3 文件名 &#x1f3a1;三、二进制文件和文本…

数据库中不存在该字段

mybatisplus 定义的类中某些字段是数据库里面没有的&#xff0c;我们可用tablefield(existfalse)来注解&#xff0c;演示如下&#xff1a;

计算机组成原理———I\O系统精讲<1>

本篇文章主要介绍输入输出系统的发展概况 一.输入输出系统的发展概况 1.早期阶段 该阶段的特点是I/O设备与主存交换信息都必须通过CPU 当时的I/O设备有如下几个特点&#xff1a; &#xff08;1&#xff09;每个I\O设备都必须配有一套独立的逻辑电路与CPU相连&#xff0c;用来…

Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)

上篇文章&#xff1a;Linux操作系统7- 线程同步与互斥6&#xff08;POSIX信号量与环形队列生产者消费者模型&#xff09;-CSDN博客 本篇代码仓库&#xff1a;myLerningCode/l36 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 单生产单消费单保…

全面讲解python的uiautomation包

在常规的模拟鼠标和键盘操作&#xff0c;我们一般使用pyautogui&#xff0c;uiautomation模块不仅能直接支持这些操作&#xff0c;还能通过控件定位方式直接定位到目标控件的位置&#xff0c;而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…

图解CNN、RNN、LSTM

一、CNN 二、RNN 三、LSTM 以上笔记参考自b站up主 自然卷小蛮&#xff08;自然卷小蛮的个人空间-自然卷小蛮个人主页-哔哩哔哩视频&#xff09;&#xff0c;感兴趣的可以去深入了解。

3.25学习总结 抽象类和抽象方法+接口+内部类+API

抽象类和抽象方法&#xff1a; 有抽象方法&#xff0c;那么类肯定是抽象类。父类不一定是抽象的&#xff0c;但如果父类中有抽象方法那一定是抽象类。 如果子类中都存在吃这个行为&#xff0c;但吃的具体东西不同&#xff0c;那么吃这个行为定义在父类里面就是抽象方法&#x…

Ubuntu22.04 UEFI系统配置Apache Tomcat/8.5.87为开机自动启动

前置条件&#xff0c;Java与Tomcat目录均为/usr/local路径下。 java安装目录为&#xff1a;/usr/local/java tomcat安装目录为&#xff1a;/usr/local/tomcat 1. 创建 Tomcat 专用用户和组&#xff08;可选但推荐&#xff09; # 创建 tomcat 用户组 sudo groupadd tomcat#…