当前位置: 首页 > news >正文

项目集成Spring Security授权部分

一、需求分析

  • 业务背景
    当前项目采用前后端分离架构,后端需要对接口访问进行严格控制,防止未授权访问。鉴于系统需要支持高并发与分布式部署,采用无状态认证方式显得尤为重要。

  • 核心需求

    • 无状态认证:使用 JWT 作为令牌,前后端分离项目不依赖 session,保障系统的横向扩展能力。
    • 动态权限校验:每个用户的可访问接口列表存储在 Redis 缓存中,通过令牌解析得到用户信息后,再根据缓存中的数据判断是否具备访问权限。
    • 白名单与忽略路径:配置公开接口与忽略路径,允许无需认证的请求(例如登录接口、静态资源等)直接放行。

设计方案

  1. 安全过滤链

    • 使用 Spring Security 提供的 SecurityFilterChain 进行整体安全配置。
    • 从配置文件中读取忽略路径列表,利用 antMatchers 放行这些请求。
    • 对其他请求,委托自定义的 JwtTokenAuthorizationManager 进行权限校验。
  2. JWT 授权管理

    • 通过请求头获取 JWT 令牌,利用工具类解析出 JWT 中包含的用户信息(例如当前用户对象)。
    • 从 Redis 缓存中获取该用户拥有访问权限的 URL 列表,并使用 AntPathMatcher 进行路径匹配,判断当前请求是否在允许列表中。
  3. 其他安全策略

    • 禁用 session 管理(设置为无状态)。
    • 关闭 CSRF 保护(前后端分离场景下通常不需要)。
    • 配置密码加密器(使用 BCrypt 加密)。

二、代码解读

2.1 SecurityConfig 配置类

@Configuration
public class SecurityConfig {@Autowiredprivate JwtTokenAuthorizationManager jwtTokenAuthorizationManager;@Autowiredprivate SecurityConfigProperties securityConfigProperties;@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {// 获取忽略列表,从配置文件加载 ignoreUrl 列表List<String> ignoreUrl = securityConfigProperties.getIgnoreUrl();// 配置放行忽略路径(如登录、注册或其他公共接口)http.authorizeHttpRequests().antMatchers(ignoreUrl.toArray(new String[ignoreUrl.size()])).permitAll()// 其他请求交由自定义 JwtTokenAuthorizationManager 校验权限.anyRequest().access(jwtTokenAuthorizationManager);// 设置无状态会话管理,关闭 session(适用于 RESTful 接口)http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);// 关闭缓存,确保安全头信息不被浏览器缓存http.headers().cacheControl().disable();// 关闭 CSRF(前后端分离项目一般不需要 CSRF 防护)http.csrf().disable();return http.build();}/*** 创建认证管理器 Bean*/@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {return authenticationConfiguration.getAuthenticationManager();}/*** 定义密码加密器,采用 BCrypt 算法*/@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}
}
解析说明
  • 忽略路径的配置
    SecurityConfigProperties 中读取忽略 URL 列表,通过 antMatchers(...).permitAll() 放行,不需要进行认证与授权。

  • 授权管理器
    对除忽略路径外的其他请求,调用自定义的 JwtTokenAuthorizationManager 进行权限校验,确保只有拥有权限的用户才能访问相应资源。

  • 无状态策略与安全设置
    配置无状态的 session 管理(STATELESS),同时关闭缓存和 CSRF,适应前后端分离的 RESTful 接口场景。

  • 认证管理器和密码加密器
    分别配置了认证管理器和基于 BCrypt 的密码加密器,保障用户密码的安全存储。

2.2 JwtTokenAuthorizationManager 自定义授权管理器

@Component
public class JwtTokenAuthorizationManager implements AuthorizationManager<RequestAuthorizationContext> {@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate JwtTokenManagerProperties jwtTokenManagerProperties;private AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext requestAuthorizationContext) {// 获取 HttpServletRequest,提取请求头中的 tokenHttpServletRequest request = requestAuthorizationContext.getRequest();String token = request.getHeader(Constants.USER_TOKEN);if(ObjectUtil.isEmpty(token)){return new AuthorizationDecision(false);}// 使用 JWT 工具类解析 token,获取 ClaimsClaims claims = JwtUtil.parseJWT(jwtTokenManagerProperties.getBase64EncodedSecretKey(), token);if(ObjectUtil.isEmpty(claims)){return new AuthorizationDecision(false);}// 从 token 中解析出当前用户信息,并转为 UserVo 对象UserVo userVo = JSONUtil.toBean(String.valueOf(claims.get("currentUser")), UserVo.class);// 从 Redis 缓存中获取该用户的访问权限 URL 列表String accessUrlsCacheKey = CacheConstants.ACCESS_URLS_CACHE + userVo.getId();String accessUrlsJson = redisTemplate.opsForValue().get(accessUrlsCacheKey);List<String> accessUrls = null;if(StringUtils.isNotEmpty(accessUrlsJson)){accessUrls = JSONUtil.toList(accessUrlsJson, String.class);}// 构造当前请求的标识,例如 "GET/nursing_project/**"String targetUrl = request.getMethod() + request.getRequestURI();// 遍历缓存中保存的权限 URL,使用 AntPathMatcher 判断当前请求是否匹配for (String url : accessUrls) {if(antPathMatcher.match(url, targetUrl)){return new AuthorizationDecision(true);}}// 不匹配则返回拒绝访问,系统将自动返回 403 状态码return new AuthorizationDecision(false);}
}
解析说明
  • Token 提取与解析
    从请求头中获取 JWT token,利用 JwtUtil.parseJWT 方法进行解析,获取 Claims。如果 token 无效或解析失败,直接拒绝访问。

  • 用户信息与权限获取
    从 Claims 中提取包含的用户信息,并借助 Redis 缓存,根据用户 ID 获取其允许访问的 URL 列表。这样做的好处是可以动态更新用户权限,无需重启服务。

  • 权限校验
    构造当前请求的标识(HTTP 方法 + 请求 URI),利用 AntPathMatcher 与缓存中的 URL 模式进行匹配,若有任一匹配成功,则返回授权通过。

2.3 SecurityConfigProperties 配置类

@Slf4j
@Data
@ConfigurationProperties(prefix = "zzyl.framework.security")
@Configuration
public class SecurityConfigProperties {/*** 默认密码*/String defaulePassword;/*** 白名单列表(公开接口)*/private List<String> publicAccessUrls;/*** 忽略列表(无需认证的接口)*/private List<String> ignoreUrl;
}
解析说明
  • 配置属性注入
    通过 @ConfigurationProperties 注解,将配置文件中以 zzyl.framework.security 为前缀的配置映射到该类属性上,方便在 Security 配置中动态读取忽略的 URL 列表和其他安全相关的配置项。

  • 属性用途

    • defaulePassword:项目中预设的默认密码(可用于测试或初始化)。
    • publicAccessUrlsignoreUrl:分别定义了公开访问与无需认证的接口列表,保证不同接口的访问策略灵活配置。

三、总结

学习收获

  • 无状态认证思路
    通过 JWT 结合 Redis 实现了无状态的权限校验,既避免了 session 的管理压力,也便于集群部署下的权限动态更新。

  • 灵活的权限控制
    自定义 JwtTokenAuthorizationManager 根据用户缓存的权限列表动态校验请求,利用 AntPathMatcher 实现了路径模式匹配,提升了系统的灵活性与可扩展性。

  • 配置与解耦
    将忽略路径和其他安全配置集中管理(通过 SecurityConfigProperties),使得代码更具可维护性,方便在不同环境下进行调整。

相关文章:

项目集成Spring Security授权部分

一、需求分析 业务背景 当前项目采用前后端分离架构&#xff0c;后端需要对接口访问进行严格控制&#xff0c;防止未授权访问。鉴于系统需要支持高并发与分布式部署&#xff0c;采用无状态认证方式显得尤为重要。 核心需求 无状态认证&#xff1a;使用 JWT 作为令牌&#xff0…...

5. k8s二进制集群之ETCD集群部署

下载etcd安装包创建etcd配置文件准备证书文件和etcd存储目录ETCD证书文件安装(分别对应指定节点)创建证书服务的配置文件启动etcd集群验证etcd集群状态继续上一篇文章《k8s二进制集群之ETCD集群证书生成》下面介绍一下etcd证书生成配置。 下载etcd安装包 https://github.com…...

MV结构下设置Qt表格的代理

目录 预备知识 模型 关联 刷新 示例 代理 模型 界面 结果 完整资料见&#xff1a; 所谓MV结构&#xff0c;是“model-view”&#xff08;模型-视图&#xff09;的简称。也就是说&#xff0c;表格的数据保存在model中&#xff0c;而视图由view实现。在我前面的很多博客…...

二维数组 C++ 蓝桥杯

1.稀疏矩阵 #include<iostream> using namespace std;const int N 1e4 10; int a[N][N];int main() {int n, m; cin >> n >> m;for (int i 1; i < n; i) {for (int j 1; j < m; j) {cin >> a[i][j];}}for (int j m; j > 1; j--) {for (i…...

【Linux】文件描述符

初识文件 之前我们认识到当我们进行创建出一个空文件在磁盘上也是占用一部分空间的&#xff0c;因为文件的组成是由文件内容和文件属性共同构成。 文件内容属性&#xff0c;那我们对文件进行操作无外乎就是对内容和属性两个方面进行操作。 文件在磁盘上进行存储&#xff0c;…...

大语言模型的个性化综述 ——《Personalization of Large Language Models: A Survey》

摘要&#xff1a; 本文深入解读了论文“Personalization of Large Language Models: A Survey”&#xff0c;对大语言模型&#xff08;LLMs&#xff09;的个性化领域进行了全面剖析。通过详细阐述个性化的基础概念、分类体系、技术方法、评估指标以及应用实践&#xff0c;揭示了…...

AI 编程工具—Cursor进阶使用 Agent模式

AI 编程工具—Cursor进阶使用 Agent模式 我们在使用Cursor 的是有,在Composer 模式下,提交的是有两种模式 Normal 模式,也就是默认的模式Agent 模式Agent 模式可以帮我们生成代码文件,执行程序,安装依赖,并且完成一些列的工作 这里有个点很重要就是在Agent 模式下,Cur…...

【AI大模型】DeepSeek API大模型接口实现

目录 一、DeepSeek发展历程 2023 年&#xff1a;创立与核心技术突破 2024 年&#xff1a;开源生态与行业落地 2025 年&#xff1a;多模态与全球化布局 性能对齐 OpenAI-o1 正式版​ 二、API接口调用 1.DeepSeek-V3模型调用 2.DeepSeek-R1模型调用 三、本地化部署接口调…...

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外&#xff0c;还有一个小众的市场&#xff0c;那就是多媒体展厅场景&#xff0c;这个场景目前处于垄断地位的软件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…...

Kafka分区策略实现

引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中&#xff0c;合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略&#xff08;默认&#xff09; 轮询策略是 Kafka 默认的分区策略&#xff08;当消息没有指定键时&…...

【归属地】批量号码归属地查询按城市高速的分流,基于WPF的解决方案

在现代商业活动中&#xff0c;企业为了提高营销效果和资源利用效率&#xff0c;需要针对不同地区的市场特点开展精准营销。通过批量号码归属地查询并按城市分流&#xff0c;可以为企业的营销决策提供有力支持。 短信营销&#xff1a;一家连锁餐饮企业计划开展促销活动&#xf…...

为AI聊天工具添加一个知识系统 之78 详细设计之19 正则表达式 之6

本文要点 要点 本项目设计的正则表达式 是一个 动态正则匹配框架。它是一个谓词系统&#xff1a;谓词 是运动&#xff0c;主语是“维度”&#xff0c;表语是 语言处理。主语的一个 双动结构。 Reg三大功能 语法验证、语义检查和 语用检验&#xff0c;三者 &#xff1a;语义约…...

使用Java操作Redis数据类型的详解指南

SEO Meta Description: 详细介绍如何使用Java操作Redis的各种数据类型&#xff0c;包括字符串、哈希、列表、集合和有序集合&#xff0c;提供代码示例和最佳实践。 介绍 Redis是一种开源的内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。它支持多种数据结构&#…...

一表总结 Java 的3种设计模式与6大设计原则

设计模式通常分为三大类&#xff1a;创建型、结构型和行为型。 创建型模式&#xff1a;主要用于解决对象创建问题结构型模式&#xff1a;主要用于解决对象组合问题行为型模式&#xff1a;主要用于解决对象之间的交互问题 创建型模式 创建型模式关注于对象的创建机制&#xf…...

Hive on Spark优化

文章目录 第1章集群环境概述1.1 集群配置概述1.2 集群规划概述 第2章 Yarn配置2.1 Yarn配置说明2.2 Yarn配置实操 第3章 Spark配置3.1 Executor配置说明3.1.1 Executor CPU核数配置3.1.2 Executor内存配置3.1.3 Executor个数配置 3.2 Driver配置说明3.3 Spark配置实操 第4章 Hi…...

Java集合面试总结(题目来源JavaGuide)

问题1&#xff1a;说说 List,Set,Map 三者的区别&#xff1f; 在 Java 中&#xff0c;List、Set 和 Map 是最常用的集合框架&#xff08;Collection Framework&#xff09;接口&#xff0c;它们的主要区别如下&#xff1a; 1. List&#xff08;列表&#xff09; 特点&#xf…...

计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)

应用层概述&#xff1a; 功能&#xff1a; 常见协议 应用层与其他层的关系 网络应用模型 C/S模型&#xff1a; 优点 缺点 P2P模型&#xff1a; 优点 缺点 DNS系统&#xff1a; 基本功能 系统架构 域名空间&#xff1a; DNS 服务器 根服务器&#xff1a; 顶级域…...

ES6基础内容

ES 全称 EcmaScript ,是脚本语言的规范&#xff0c;而平时经常编写的 JavaScript 是 EcmaScript 的一种实现&#xff0c;所以 ES 新特性其实指的就是 JavaScript 的新特性。 一、 let变量声明和声明特性 1.1 变量声明 <!DOCTYPE html> <html lang"en">…...

DeepSeek本地部署的一些使用体会

春节期间我也尝试了一下Deepseek的本地部署&#xff0c;方案选用了Ollama Chatbox或AnythingLLM。Chatbox里有很多有意思的“助手”&#xff0c;而AnythingLLM支持本地知识库。 网上教程很多&#xff0c;总的来说还是很方便的&#xff0c;不需要费太多脑子。甚至可以这么说&a…...

鲸鱼算法 matlab pso

算法原理 鲸鱼优化算法的核心思想是通过模拟座头鲸的捕食过程来进行搜索和优化。座头鲸在捕猎时会围绕猎物游动并产生气泡网&#xff0c;迫使猎物聚集。这一行为被用来设计搜索策略&#xff0c;使算法能够有效地找到全局最优解。 算法步骤 ‌初始化‌&#xff1a;随机生成一…...

经验小波变换(EWT):从理论基石到信号分解实战

1. 经验小波变换&#xff08;EWT&#xff09;的前世今生 我第一次接触EWT是在处理一段轴承振动信号时。当时用传统EMD方法分解出的IMF分量里&#xff0c;高频噪声和故障特征频率完全混在一起&#xff0c;就像把咖啡和牛奶搅成了拿铁——虽然都是白色液体&#xff0c;但根本分不…...

Vex:VS Code向量数据库管理扩展,提升AI开发效率

1. 项目概述&#xff1a;Vex&#xff0c;一个为开发者设计的向量数据库管理利器如果你正在用 VS Code 开发 AI 应用&#xff0c;并且和向量数据库&#xff08;比如 Milvus 或 ChromaDB&#xff09;打交道&#xff0c;那你大概率经历过这样的场景&#xff1a;为了插入几条测试向…...

信息安全工程师-主动防御体系核心技术:从监测溯源到隐私保护全解析

一、引言&#xff08;一&#xff09;技术定义与软考定位主动防御是相对于被动防御的安全理念&#xff0c;核心是通过主动诱捕、溯源标记、容忍恢复等技术&#xff0c;突破传统 “边界防护 事后补救” 的局限&#xff0c;实现攻击全生命周期的管控。本文涉及的数字水印、网络攻…...

JSON数据同步利器:深度解析ogre-software/json-synchronizer的核心原理与应用

1. 项目概述&#xff1a;一个被低估的JSON数据同步利器如果你经常和JSON数据打交道&#xff0c;尤其是在前后端分离、微服务架构或者多数据源集成的场景下&#xff0c;你肯定遇到过这样的烦恼&#xff1a;手头有两份甚至多份JSON数据&#xff0c;它们结构相似&#xff0c;但内容…...

清华PPT模板终极指南:告别PPT设计烦恼,轻松制作专业演示

清华PPT模板终极指南&#xff1a;告别PPT设计烦恼&#xff0c;轻松制作专业演示 【免费下载链接】THU-PPT-Theme 清华主题PPT模板 项目地址: https://gitcode.com/gh_mirrors/th/THU-PPT-Theme 还在为学术答辩、项目汇报的PPT设计而头疼吗&#xff1f;每次打开PowerPoin…...

如何快速解锁中兴光猫:zteOnu工具的完整指南

如何快速解锁中兴光猫&#xff1a;zteOnu工具的完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫工厂模式解锁神器zteOnu是一款专为网络爱好者设计的开源工具&#xff…...

保姆级教程:用Docker Compose在Linux服务器上部署Transmission,并搞定IPv6加速

深度指南&#xff1a;基于Docker Compose的Transmission部署与IPv6优化实战 在当今数字资源获取日益便捷的时代&#xff0c;一个稳定高效的下载工具对于技术爱好者和资源收集者来说至关重要。Transmission作为一款轻量级、高性能的BitTorrent客户端&#xff0c;凭借其简洁的界面…...

从入门到精通:泉盛UV-K5/K6开源固件的无线通信革命

从入门到精通&#xff1a;泉盛UV-K5/K6开源固件的无线通信革命 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 想象一下&#xff0c;你手中的百元…...

别再让UDP丢包坑了你!手把手教你用C语言实现应用层分包组包(附完整代码)

从零构建高可靠UDP传输&#xff1a;C语言实现应用层分包组包实战指南 在实时音视频、在线游戏等对延迟极度敏感的领域&#xff0c;UDP协议因其无连接、低开销的特性成为首选。但许多开发者第一次使用UDP发送大文件时都会遇到这样的场景&#xff1a;明明局域网测试一切正常&…...

Neoscroll.nvim与Telescope集成:实现搜索结果的流畅滚动

Neoscroll.nvim与Telescope集成&#xff1a;实现搜索结果的流畅滚动 【免费下载链接】neoscroll.nvim Smooth scrolling neovim plugin written in lua 项目地址: https://gitcode.com/gh_mirrors/ne/neoscroll.nvim Neoscroll.nvim是一款用Lua编写的Neovim平滑滚动插件…...