Spring Security 深度解析:打造坚不可摧的用户认证与授权系统
Spring Security 深度解析:打造坚不可摧的用户认证与授权系统
一、引言
在当今数字化时代,构建安全可靠的用户认证与授权系统是软件开发中的关键任务。Spring Security 作为一款功能强大的 Java 安全框架,为开发者提供了全面的解决方案。本文将深入解析 Spring Security 的核心原理,通过详细代码实例,展示如何打造坚不可摧的用户认证与授权系统。
二、Spring Security 核心架构
(一)安全过滤器链
Spring Security 使用一系列过滤器来处理请求,实现安全功能。这些过滤器按顺序排列,每个过滤器负责不同的任务。例如:
public class CustomFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 自定义安全逻辑filterChain.doFilter(request, response);}
}
在 Spring Security 配置中,可以通过重写 configure
方法来添加自定义过滤器。
(二)认证与授权流程
- 认证流程 :用户提交用户名和密码,Spring Security 的
AuthenticationManager
验证凭据,生成Authentication
对象。 - 授权流程 :在用户认证成功后,根据用户角色和权限,控制对资源的访问。
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().antMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated().and().formLogin().and().logout();
}
三、用户认证实现
(一)基于数据库的用户认证
- 数据库表设计 :创建用户表(
users
)和角色表(authorities
),并建立关联关系。 - 自定义用户详情服务 :实现
UserDetailsService
接口,加载用户信息。
@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));}private Collection<? extends GrantedAuthority> getAuthorities(User user) {return user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role.getName())).collect(Collectors.toList());}
}
(二)基于 JWT 的认证
- JWT 生成与解析 :使用 JWT 库生成和解析令牌。
- 自定义过滤器 :在请求头中提取 JWT 令牌,并进行验证。
public class JwtAuthenticationFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {String jwt = token.substring(7);try {// 解析 JWT 并验证Claims claims = Jwts.parser().setSigningKey("secretKey").parseClaimsJws(jwt).getBody();// 设置用户信息UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(claims.getSubject(), null, getAuthorities(claims));SecurityContextHolder.getContext().setAuthentication(authentication);} catch (ExpiredJwtException e) {// 处理过期令牌}}filterChain.doFilter(request, response);}private List<GrantedAuthority> getAuthorities(Claims claims) {// 从 JWT 中提取角色信息return null;}
}
四、授权控制实现
(一)基于角色的访问控制(RBAC)
- 定义角色和权限 :在系统中定义不同角色(如管理员、用户等),并为每个角色分配相应的权限。
- 使用注解进行方法级授权 :在控制器方法上使用
@PreAuthorize
注解,控制访问权限。
@RestController
@RequestMapping("/admin")
public class AdminController {@PreAuthorize("hasRole('ADMIN')")@GetMapping("/dashboard")public String getAdminDashboard() {return "Admin Dashboard";}
}
(二)基于表达式的访问控制
- 编写自定义表达式 :通过实现
AuthorizationRule
接口,创建自定义授权规则。 - 在配置中使用表达式 :在
configure
方法中,使用expressionHandler
来指定自定义表达式处理器。
@Override
protected void configure(HttpSecurity http) throws Exception {http.expressionHandler(new CustomWebSecurityExpressionHandler());// 其他配置
}
五、安全加固与优化
(一)防止常见安全漏洞
- CSRF 攻击防护 :在 Spring Security 配置中启用 CSRF 保护。
@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());// 其他配置
}
- XSS 攻击防护 :对用户输入进行过滤和编码。
@InitBinder
public void initBinder(WebDataBinder binder) {binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
(二)性能优化
- 缓存用户信息 :使用缓存(如 Redis)存储用户信息,减少数据库查询。
- 异步认证处理 :对认证请求进行异步处理,提高响应速度。
@Async
public CompletableFuture<UserDetails> loadUserByUsernameAsync(String username) {return CompletableFuture.supplyAsync(() -> customUserDetailsService.loadUserByUsername(username));
}
六、结语
通过深入解析 Spring Security 的核心架构和关键功能,我们展示了如何构建一个健壮的用户认证与授权系统。在实际开发中,应根据具体需求灵活运用 Spring Security 的特性,并不断关注安全漏洞和性能优化。只有这样,才能为用户提供更安全可靠的服务。
相关文章:

Spring Security 深度解析:打造坚不可摧的用户认证与授权系统
Spring Security 深度解析:打造坚不可摧的用户认证与授权系统 一、引言 在当今数字化时代,构建安全可靠的用户认证与授权系统是软件开发中的关键任务。Spring Security 作为一款功能强大的 Java 安全框架,为开发者提供了全面的解决方案。本…...

Selenium模拟人类行为,操作网页的方法(全)
看到有朋友评论问,用selenium怎么模仿人类行为,去操作网页的页面呢? 我想了想,这确实是一个很大的点,不应该是一段代码能解决的, 就像是,如果让程序模拟人类的行为。例如模拟人类买菜,做饭&am…...
HNUST湖南科技大学-软件测试期中复习考点(保命版)
使用说明:本复习考点仅用于及格保命。软件测试和其他专业课不太一样,记忆的太多了,只能说考试的时候,想到啥就写啥,多写一点!多写一点!多写一点!(重要事情说三遍…...
如何使用极狐GitLab 软件包仓库功能托管 python?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 PyPI 包 (BASIC ALL) 在项目的软件包库中发布 PyPI 包。然后在需要将它们用作依赖项时安装它们。 软件包库适用…...

右值引用的剖析
引入:为什么要有右值引用? 右值引用的存在,就是为了解决左值引用解决不了的问题! 左值引用的问题: 我们知道,左值引用在做参数和做返回值都可以提高效率;但是有时候,我们无法用左…...
tmpfs和普通文件系统相比有哪些优缺点
tmpfs 是一种基于内存的文件系统,与普通文件系统相比,在读写速度、数据安全性等方面存在明显差异,以下是其优缺点对比: 优点 读写速度快:普通文件系统读写数据时,需要通过硬盘等存储设备进行 I/O 操作&…...

高效Python开发:uv包管理器全面解析
目录 uv简介亮点与 pip、pip-tools、pipx、poetry、pyenv、virtualenv 对比 安装uv快速开始uv安装pythonuv运行脚本运行无依赖的脚本运行有依赖的脚本创建带元数据的 Python 脚本使用 shebang 创建可执行文件使用其他package indexes锁定依赖提高可复现性指定不同的 Python 版本…...
配置指定地址的conda虚拟Python环境
创建指定路径的 Conda 环境 在创建环境时,使用 --prefix 参数指定自定义路径: conda create --prefix/your/custom/path/my_env python3.8 说明: /your/custom/path/my_env:替换为你希望存放环境的路径(如 D:\projec…...
《解锁React Native与Flutter:社交应用启动速度优化秘籍》
React Native和Flutter作为当下热门的跨平台开发框架,在优化应用启动性能方面各有千秋。今天,我们就深入剖析它们独特的策略与方法。 React Native应用的初始包大小对启动速度影响显著。在打包阶段,通过精准分析依赖,去除未使用的…...

【Linux系统编程】进程属性--进程状态
1.进程的状态 1.1进程的状态在PCB中就是一个变量 一般用宏来定义,例如: #define RUNNING 1 #define BLOCK 2 struct task_struct中的int status 1.2并行和并发 CPU执行代码,不是把进程代码执行完毕,才执行下一个࿰…...
Go Modules 的基本使用
在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。以下是详细步骤和最佳实践: 一、首次初始化项目的标准流程 1.1 创建项目目录并初始化模块 mkdir myproject && cd myproject go mod init github…...
光流 | 基于深度学习的光流估计算法汇总,原理,公式,流程图,代码
基于深度学习的光流算法 一、光流估计的基本原理二、基于深度学习的光流估计算法1. **FlowNet系列**2. **FlowNet 2.0**3. **PWC-Net**4. **RAFT(Recurrent All-Pairs Field Transformers)**5. **LiteFlowNet系列**三、算法流程图示例FlowNet2.0架构PWC-Net金字塔处理流程四、…...

高精度之加减乘除之多解总结(加与减篇)
开篇总述:精度计算的教学比较杂乱,无系统的学习,且存在同法多线的方式进行同一种运算,所以我写此篇的目的只是为了直指本质,不走教科书方式,步骤冗杂。 一,加法 我在此讲两种方法: …...

dify插件接入fastmcp示例
文章目录 1. 使用python完成mcp服务1.1 准备环境(python安装fastmcp)1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略(支持 MCP 工具) 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置ÿ…...

c++——二叉树进阶
1. 内容安排说明 二叉树在前面C数据结构阶段已经讲过,本节取名二叉树进阶是因为: 1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构 2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性 3. 二叉树中部…...
MySQL 中如何进行 SQL 调优?
在MySQL中进行SQL调优是一个系统性工程,需结合索引优化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。以下是具体优化方法及案例说明: 一、索引优化:精准提速的关键 索引类型选择 普通索引:加速频繁查询的列&…...
【C++游戏引擎开发】第33篇:物理引擎(Bullet)—射线检测
一、射线检测核心理论体系 1.1 射线检测的数学基础 1.1.1 参数化射线方程 射线在三维空间中的数学表达采用参数方程: r ( t ) = o + t d ^ ( t ∈ [...

基于flask+pandas+csv的报表实现
基于大模型根据提示词去写SQL执行SQL返回结果输出报表技术上可行的,但为啥还要基于pandas去实现呢? 原因有以下几点: 1、大模型无法满足实时性输出报表的需求; 2、使用大模型比较适合数据量比较大的场景,大模型主要…...

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)
文章目录 一、QFont常用方法二、常用方法总结1. 基础属性设置2. 高级样式控制3. 序列化与反序列化4. 字体信息获取 三、应用实例 字体类QFont用于设置界面控件上显示的字体,它包含字体名称、字体尺寸、粗体字、斜体字、删除线、上划线、下划线、字体间距等属性。 如…...
北斗导航 | 北斗RTK定位厄待解决的问题,未来发展
北斗RTK(实时动态定位)技术在高精度定位领域已取得显著进展,但仍面临一系列技术挑战和未来发展方向。以下从亟待解决的问题和未来发展趋势两方面进行详细分析: 一、北斗RTK定位亟待解决的核心问题 电离层扰动对定位精度的影响 电离层扰动是当前北斗RTK技术面临的最大自然挑…...

宝塔服务安装使用的保姆级教程
宝塔介绍: 宝塔面板(BT Panel) 是一款 国产的服务器运维管理面板,主要用于简化 Linux/Windows 服务器的网站、数据库、FTP、防火墙等管理操作。它通过图形化界面(Web端)和命令行工具(bt 命令&a…...

Linux平台下SSH 协议克隆Github远程仓库并配置密钥
目录 注意:先提前配置好SSH密钥,然后再git clone 1. 检查现有 SSH 密钥 2. 生成新的 SSH 密钥 3. 将 SSH 密钥添加到 ssh-agent 4. 将公钥添加到 GitHub 5. 测试 SSH 连接 6. 配置 Git 使用 SSH 注意:先提前配置好SSH密钥,然…...
Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux
🚀 Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux 使用 Electron 开发桌面应用只是第一步,最终我们还需要将应用打包成用户可运行的可执行文件(如 .exe、.dmg、.AppImage),并能在各平台…...

Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析
目录 1.前言 2.正文 2.1状态码 2.2HTTP与HTTPS的关系 2.3SSL协议 2.3.1对称加密 2.3.2非对称加密 2.3.3中间人攻击 2.3.4校验机制 2.3.4.1证书 2.3.4.2数字签名 1. 数字签名的生成过程 2. 数字签名的验证过程 2.4TLS协议(握手过程) 3.小结…...

【基础IO下】磁盘/软硬链接/动静态库
前言: 文件分为内存文件和磁盘文件。磁盘文件是一个特殊的存在,因为磁盘文件不属于冯诺依曼体系,而是位于专门的存储设备中。因此,磁盘文件存在的意义是将文件更好的存储起来,一边后续对文件进行访问。在高效存储磁盘…...

SpringBoot项目容器化进行部署,meven的docker插件远程构建docker镜像
需求:将Spring Boot项目使用容器化进行部署 前提 默认其他环境,如mysql,redis等已经通过docker部署完毕, 这里只讨论,如何制作springboot项目的镜像 要将Spring Boot项目使用docker容器进行部署,就需要将Spring Boot项目构建成一个docker镜像 一、手动…...

【小记】excel vlookup一对多匹配
一个学生报四门课,输出每个学生课程 应用概述操作预处理数据计数指令 COUNTIFS进行一对多匹配 vlookup 应用概述 应用场景:学生报名考试,需要整理成指定格式,发给考试院。 一个学生最多报考四门 格式实例:准考证号 …...

LeetCode热题100 两数之和
目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️🐿️🐿…...
问题解决思路:numpy:DLL load failed
首先明确几点: 1这是在使用anaconda中除开base环境下其他envs时出现的问题 2这不是pytorch版本过高的问题(也可以是) 3这不是pytorch安装错误的问题(也可以是)需要检查是否正确安装 解决思路: 本人遇到…...

[春秋云镜] Brute4Road 仿真场景
文章目录 靶标介绍:知识点约束性委派攻击 外网redis主从复制base64提权 内网搭建代理wpcargo插件漏洞mssql弱口令SweetPotato提权远程桌面连接mimikatz抓取hash约束性委派攻击 参考文章 靶标介绍: Brute4Road是一套难度为中等的靶场环境,完成…...