1. 概念

  1. Spring Security:Spring 提供的安全框架,用于保护应用程序免受未授权访问,提供认证、授权、CSRF 防护等功能。

  2. 核心功能

    • 认证(Authentication):确认用户身份(登录过程)。

    • 授权(Authorization / Access Control):控制用户访问资源的权限。

    • 安全上下文(SecurityContext):存储当前用户信息的容器。

    • 过滤器链(Filter Chain):拦截请求,按顺序执行安全逻辑。


2. 核心组件

组件作用
UserDetailsService用户信息服务,用于根据用户名查询用户信息(用户名、密码、权限)
UserDetails用户信息接口(用户名、密码、权限、状态)
GrantedAuthority用户权限/角色接口,用于授权判断
PasswordEncoder密码加密器,如 BCryptPasswordEncoder
AuthenticationManager认证管理器,负责执行认证逻辑
SecurityContextHolder存储认证信息的上下文,当前线程可访问
HttpSecurity配置 HTTP 请求安全策略(认证/授权、表单登录、CSRF 等)
FilterChainProxy核心过滤器链,所有请求经过一系列安全过滤器处理

3. 常见配置方式(Spring Boot)

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {// 用户信息服务@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());return manager;}// 密码编码器@Beanpublic PasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}// HTTP 安全配置@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/r/r1").hasAuthority("p1").antMatchers("/r/r2").hasAuthority("p2").antMatchers("/r/**").authenticated().anyRequest().permitAll().and().formLogin().successForwardUrl("/login-success"); // 登录成功后转发}
}

4.认证与授权流程

4.1 结构总览

         Spring Security所解决的问题就是安全访问控制,而安全访问控制功能其实就是对所有进入系统的请求进行拦截, 校验每个请求是否能够访问它所期望的资源。根据前边知识的学习,可以通过FilterAOP等技术来实现,Spring Security对Web资源的保护是靠Filter实现的,所以从这个Filter来入手,逐步深入Spring Security原理。
         当初始化Spring Security时,会创建一个名为 SpringSecurityFilterChain Servlet过滤器,类型为 org.springframework.security.web.FilterChainProxy,它实现了javax.servlet.Filter,因此外部的请求会经过此
类,下图是Spring Security过虑器链结构图:

        FilterChainProxy是一个代理,真正起作用的是FilterChainProxySecurityFilterChain所包含的各个Filter,同时 这些Filter作为BeanSpring管理,它们是Spring Security核心,各有各的职责,但他们并不直接处理用户的,也不直接处理用户的授权,而是把它们交给了认证管理器(AuthenticationManager)和决策管理器(AccessDecisionManager)进行处理,下图是FilterChainProxy相关类的UML图示。

spring Security功能的实现主要是由一系列过滤器链相互配合完成。

下面介绍过滤器链中主要的几个过滤器及其作用:
      (1)SecurityContextPersistenceFilter:
            这个Filter是整个拦截过程的入口和出口(也就是第一个和最后一个拦截 器),会在请求开始时从配置好的 SecurityContextRepository 中获取 SecurityContext,然后把它设置给 SecurityContextHolder。
           在请求完成后将 SecurityContextHolder 持有的 SecurityContext 再保存到配置好的 SecurityContextRepository,同时清除 securityContextHolder 所持有的 SecurityContext
     (2)UsernamePasswordAuthenticationFilter
            用于处理来自表单提交的认证。该表单必须提供对应的用户名和密码,其内部还有登录成功或失败后进行处理的AuthenticationSuccessHandler和 AuthenticationFailureHandler,这些都可以根据需求做相关改变;
     (3)FilterSecurityInterceptor
            是用于保护web资源的,使用AccessDecisionManager对当前用户进行授权访问,前面已经详细介绍过了;
    (4)ExceptionTranslationFilter
           能够捕获来自 FilterChain 所有的异常,并进行处理。但是它只会处理两类异常:
AuthenticationException AccessDeniedException,其它的异常它会继续抛出。

4.2 认证(Authentication)流程

  1. 用户提交登录请求(POST /login 或表单提交)。

  2. UsernamePasswordAuthenticationFilter 拦截请求。

  3. AuthenticationManager 调用 ProviderManager

  4. AuthenticationProvider 使用 UserDetailsService 加载用户信息。

  5. PasswordEncoder 验证密码是否匹配。

  6. 如果验证成功:

    • 创建 Authentication 对象(包含用户名、权限)。

    • 保存到 SecurityContextHolder 中。

  7. 登录成功,执行 successHandlersuccessForwardUrl

图示

用户登录请求 → UsernamePasswordAuthenticationFilter → AuthenticationManager → AuthenticationProvider → UserDetailsService → 密码验证 → SecurityContextHolder 保存用户信息 → 登录成功处理

图解以及解析

让我们仔细分析认证过程:


4.3 授权(Authorization)流程

  1. 请求到达 Controller 前,由 FilterSecurityInterceptor 处理。

  2. 获取当前用户的 Authentication(从 SecurityContextHolder)。

  3. 对比请求资源的 权限配置(如 .antMatchers("/r/r1").hasAuthority("p1"))。

  4. 判断用户是否拥有访问权限:

    • 有权限 → 放行,访问 Controller 方法。

    • 无权限 → 拦截,返回 403 或跳转到 Access Denied 页面。

  5. Controller 执行完毕,视图渲染返回响应。

图示

HTTP 请求 → FilterSecurityInterceptor → SecurityContextHolder 获取 Authentication → 对比权限 → 放行/拒绝 → Controller 方法执行 → 返回响应

图解以及解析

分析授权流程:

5. 权限控制方式

  1. 基于 URL 的权限控制(HttpSecurity 配置)

    • .antMatchers("/r/r1").hasAuthority("p1")

  2. 基于方法的权限控制(Spring 方法级安全)

    • @PreAuthorize("hasAuthority('p1')")

    • @Secured("ROLE_ADMIN")


6. 常见注意事项

  1. UserDetailsService 只负责查询用户信息,不负责认证逻辑。

  2. PasswordEncoder 必须与存储密码一致,否则密码匹配失败。

  3. successForwardUrl → 服务器内部转发,需要自己提供对应 Controller 或页面。

  4. authenticated()hasAuthority() 的区别:

    • authenticated() → 已登录即可访问

    • hasAuthority("p1") → 必须具备指定权限才能访问

  5. Spring Boot 引入 spring-boot-starter-security → 默认启用 Security,无需 @EnableWebSecurity(除非想自定义配置)。


总结流程

  • 认证:用户身份验证 → 创建 Authentication → 保存到 SecurityContextHolder

  • 授权:访问请求 → 检查 Authentication 权限 → 放行/拒绝

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

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

相关文章

某电器5G智慧工厂网络建设全解析

随着工业4.0的全面推进和智能制造需求的不断增长,5G技术已成为智慧工厂建设的核心驱动力。某电器工厂计划通过构建高效可靠的5G网络,结合智能组网设备与工业物联网技术,实现智能化转型,提升生产运营效率。本文将详细解析该5G智慧工…

PyCharm 加载不了 conda 虚拟环境,不存在的

#工作记录前言在开发过程中,PyCharm 无法加载 Conda 虚拟环境是常见问题。在不同情况下,“Conda 可执行文件路径”的指定可能会发生变化,不会一尘不变,需要灵活处置。以下是一系列解决此问题的经验参考。检查 Conda 安装与环境创建…

xml中resultMap 的用法,数据库 JSON 字符串 → Java List/对象

文章目录一、resultMap 核心作用二、基本用法(以你的配置为例)1. 定义 resultMap2. 在 SQL 中使用 resultMap三、关键注意事项resultMap 是 MyBatis 中用于定义数据库表字段与 Java 实体类属性之间映射关系的核心配置,解决表字段名和实体类属…

PySINDy

PySINDy A Python package for the Sparse Identification of Nonlinear Dynamics from Data Abstract PySINDy 是一个用于从数据中发现主导动力系统模型的 Python 软件包。具体来说,PySINDy 提供了应用非线性动力学稀疏辨识(SINDy)[1] 方法…

校园跑腿小程序源码 | 跑腿便利店小程序(源码下载)

校园跑腿小程序源码 | 跑腿便利店小程序 本项目后端采用 midway3.0,后台采用 nuxt2.x,小程序采用 uniapp 实现的一套跑腿下单接单系统。 主要功能:跑腿、快递代取、陪练陪玩、软件安装、申请接单、用户下单、提现、物品重量计算等。 源码下载&#xf…

基于stm32的物联网OneNet火灾报警系统

1 系统功能介绍 本设计为基于STM32单片机的物联网OneNet火灾报警系统。系统通过采集环境中的温湿度、火焰检测数据,并结合物联网技术上传至OneNet云平台,实现远程监控和报警功能。系统还具备蜂鸣器报警、LED灯闪烁等本地报警功能,保证在火灾发…

校园跑腿小程序源码 _ 跑腿便利店小程序 含搭建教程

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 校园跑腿小程序源码 | 跑腿便利店小程序 本项目后端采用 midway3.0,后台采用 nuxt2.x,小程序采用 uniapp 实现的一套跑腿下单接单系统。 主要功能:跑腿、快递代…

数据结构:2-3-4 树 和 B 树

目录 我们为什么需要 2-3-4 树? 2-3-4 树的插入操作 从零推导代码 B 树 (B-Tree) 从零推导代码 我们沿着自平衡树的演化路径继续前进。我们已经学习了 2-3 树如何通过“分裂与提升”来替代 AVL 树的“旋转”,但其修复过程是“自下而上”的。现在&am…

Python爬虫实战:构建港口物流数据采集和分析系统

1. 引言 1.1 研究背景与意义 在全球化背景下,港口作为 “一带一路” 倡议的关键节点,其运营效率直接影响国际贸易流通速度。港口管理部门、物流企业及贸易公司需实时掌握船舶动态、货物吞吐量等信息以优化调度、降低成本。然而,这些信息分散于: 港口官方网站(如上海港、…

新型隐蔽恶意软件利用TP-Link、思科等路由器漏洞获取远程控制权

攻击概况安全研究人员近期发现针对多品牌网络设备的新型恶意软件攻击活动,受影响设备包括DrayTek、TP-Link、Raisecom和思科等厂商的路由器。2025年7月期间,攻击者通过利用嵌入式Web服务中的未授权命令注入漏洞传播隐蔽加载程序。初始入侵通过简单的HTTP…

对线性代数伴随矩阵的深入理解

伴随矩阵的几何直观:缩放倍率为det⁡(A)n−1\det (A)^{n-1}det(A)n−1的逆变换。 A⋅A∗∣A∣EA\cdot A^*|A|EA⋅A∗∣A∣E 最终得到的结果是将原像空间各基向量缩放了det⁡(A)\det (A)det(A)倍,故空间总体上是被放大了∣A∣n|A|^{n}∣A∣n倍。 为什么是…

uni-app 组件之自定义导航栏

前言上一篇简单的介绍了一下什么是组件,即组件是一个单独且可复用的功能模块的封装。所以这篇文章主要在实际开发中自己动手封装一个简单的导航栏组件,当然在插件市场有很多,但是自己动手封装一个才能真正领会其中的意义。一、自定义组件1.创…

android vehicle

Android Vehicle HAL架构-腾讯云开发者社区-腾讯云 Android vehicle车辆属性新增demo-CSDN博客 【IVI】VehicleService启动_android ivi-CSDN博客

【人工智能】神经网络的优化器optimizer(三):RMSProp动态自适应学习率优化器

一、算法核心原理 RMSProp(Root Mean Square Propagation)是深度学习先驱Geoffrey Hinton在2012年提出的优化算法,它基于AdaGrad算法的改进,创新性地解决了传统梯度下降法中学习率固定不变的局限性。该算法的核心机制在于采用指数…

全面解析了Java微服务架构的设计模式

一、引言:微服务架构的背景与优势随着互联网应用的复杂度不断提升,传统的单体架构(Monolithic Architecture)在可维护性、可扩展性、部署灵活性等方面逐渐暴露出瓶颈。微服务架构(Microservices Architecture&#xff…

本地组策略编辑器图形化工具

本地组策略图形化工具,添加用户权限分配功能。这将包括常见的用户权限策略设置: 目前版本在优化中,后续会添加更多功能。 # GroupPolicyGUI.ps1 # 需要以管理员权限运行Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName …

深度学习卷积神经网络项目实战——超市商品分类

卷积神经网络项目实战 1.项目简介 1.1项目名称 ​ 基于CNN实现超市商品的混合颗粒度分类(500分类) 1.2 项目简介 ​ 该项目旨在通过卷积神经网络(CNN)实现超市商品的混合颗粒度分类,主要针对商品的不同种类进行分…

网站如何被搜索引擎收录(Google、Bing、百度等)

1. 【Google 收录】注册 Google Search Console: https://search.google.com/search-console添加网站(主域名、子域名都加)验证所有权(用 DNS、HTML 文件、Meta Tag 都可以)提交 Sitemap(/sitemap.xml&…

JDK 8 → JDK 17 升级说明书(面向 Spring Boot / Spring Cloud / Spring )

自从 JDK 8 发布以来,Java 语言在持续进化,带来了许多新的功能和性能改进。而 JDK 17 作为一个长期支持版本(LTS),在许多方面超越了 JDK 8,不仅提升了语言本身的能力,还进一步提高了性能、可维护…

【ElasticSearch】使用docker compose,通过编写yml安装es8.15和kibana可视化界面操作,go连接es

使用 Docker 安装 Elasticsearch Docker 搭建 Elasticsearch Kibana 环境,并在过程中标注常见问题和解决方案。 1. 准备工作 在开始之前,请确认你本地已经安装了: 工具版本建议检查方式Docker≥ 20.xdocker -vDocker Compose≥ 2.xdocker …