4.认识SpringSecurity

简介: Spring Security 是 Spring 生态中成熟的安全框架,核心功能包括认证(支持表单、OAuth2、SAML 等多种方式)、鉴权(URL、方法级、SPEL、RBAC等)及防护 CSRF 等攻击。其架构基于过滤器链,通过 FilterChainProxy、DelegatingFilterProxy 实现安全逻辑嵌入与委托,支持多安全过滤链与异常处理机制,灵活且扩展性强。

https://docs.spring.io/spring-security/reference/index.html

1-SpringSecurity核心功能

1.认证

什么是认证:1.什么是权限管理

SpringSecurity作为一款成熟的鉴权框架,目前支持的认证机制非常的全,这里我们可以简单了解一下:

  • 表单认证
  • OAuth2.0认证
  • SAML2.0认证
  • CAS认证
  • RememberMe 自动认证
  • JAAS认证
  • OpenID 去中心化认证
  • X509认证
  • Http Basic认证
  • Http Digest认证

而SpringSecurity不仅可以支持上面的认证机制,还可以通过引入第三方依赖支持更多认证方式,同时也允许用户自定义认证逻辑(这个我们后面会讲)。

2.鉴权

基于上面的多种认证方式(实际那种认证都不影响鉴权),SpringSecurity支持基于URL的请求授权、方法访问授权、支持SPEL表达式访问控制、支持ACL自定义对象安全,同时支持动态授权配置、支持RBAC权限模型,简单一句话:基本没有SpringSecurity做不了的鉴权。

3.其他

除了熟知的认证、授权两个核心功能,SpringSecurity还可以自动防御很多网络攻击,如CSRF攻击等,可参照:

此处为语雀内容卡片,点击链接查看:https://www.yuque.com/yzxb/index/py8ihz2gghkcaht0

2-SpringSecurity核心架构

SpringSecurity的种种功能,都是基于过滤器实现的,这些过滤器根据默认或用户指定的顺序(@Order注解或实现Ordered接口)排列,形成一个过滤器链。

1.过滤链

SpringSecurity的功能实现关键就是依赖过滤器链

Spring Security 的 Servlet 支持是基于 Servlet Filter 的,因此首先大致了解一下 Filter 的作用是有帮助的。下图显示了单个 HTTP 请求的处理程序的典型分层:

客户端(广义的前端)向应用程序(广义的后端)发送请求,容器根据请求URI路径创建FilterChain,其中包含应处理 HttpServletRequest的 Filter实例和 Servlet(可以简单理解就是一个运行的tomcat容器、WebLogic容器)。在 SpringMVC 应用程序中,Servlet 是 DispatcherServlet 的实例。一个 Servlet 最多可以处理一个 HttpServletRequest 和 HttpServletResponse。大致实现代码如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
  // do something before the rest of the application
    chain.doFilter(request, response); // invoke the rest of the application
    // do something after the rest of the application
}

2.委托过滤代理

如果用户需要注册自己的过滤器标准,就可以采用委托过滤处理

Spring 提供了一个Filter名为 的实现DelegatingFilterProxy,允许在 Servlet 容器的生命周期和 Spring 的ApplicationContext。Servlet容器允许Filter使用自己的标准注册实例。您可以借助DelegatingFilterProxy通过标准 Servlet 容器机制进行注册,但将所有工作委托给实现Filter。

DelegatingFilterProxy从查找Bean Filter ApplicationContext然后调用Bean Filter,大致实现代码:

public void doFilter(ServletRequest request, 
                     ServletResponse response, 
                     FilterChain chain) {
  // 1-延迟获取注册为 Spring Bean 的 Filter
    Filter delegate = getFilterBean(someBeanName);
    // 2-将工作委托给 Spring Bean
  delegate.doFilter(request, response);
}

3.过滤器链代理

SpringSecurity的过滤器链是通过FilterChainProxy嵌入到Web项目的原生过滤器链中

Spring Security 的 Servlet 支持包含在FilterChainProxy。FilterChainProxy是 Spring Security 提供的特殊功能Filter,允许Filter通过 委托给许多实例SecurityFilterChain。由于FilterChainProxy是一个 Bean,因此它通常包装在DelegatingFilterProxy中。

简单来说:SpringSecurity的过滤器链是通过FilterChainProxy嵌入到Web项目的原生过滤器链中。而这样的过滤链也不止一个,形如下面的安全过滤链中的图示,右侧就为我们展示了多个过滤链情况。

4.安全过滤链

过滤器链也会有多个,如请求URI:/user/**和/admin/**就可以是两个过滤器链,对应下图右侧

SecurityFilterChainFilterChainProxy 使用它来确定Filter应为当前请求调用哪些 Spring Security 实例。

下图显示了多个SecurityFilterChain实例

5.处理安全异常

允许将ExceptionTranslationFilter转换为 HTTP 响应。AccessDeniedExceptionAuthenticationException

ExceptionTranslationFilter作为安全过滤器之一插入FilterChainProxy中。

ExceptionTranslationFilter下图展示了与其他组件的关系:

  • 首先,ExceptionTranslationFilter调用FilterChain.doFilter(request, response)应用程序的其余部分。
  • 如果用户未经过身份验证或者是AuthenticationException,则开始身份验证
  • SecurityContextHolder被清除
  • HttpServletRequest保存以便在身份验证成功后可用于重放原始请求。
  • 用于AuthenticationEntryPoint向客户端请求凭据。例如它可能会重定向到登录页面或发送WWW-Authenticate标头。
  • 否则,如果它是AccessDeniedException,则Access Denied。调用AccessDeniedHandler来处理拒绝访问。
相关文章
|
2月前
|
存储 数据库
数据库设计三范式
本文介绍了数据库设计中的三范式(1NF、2NF、3NF),通过实例讲解各范式的要求与应用场景。第一范式要求字段原子性,不可再分;第二范式要求消除部分依赖,确保主键决定所有非主键字段;第三范式消除传递依赖。同时指出,范式是参考而非绝对准则,实际设计应结合业务需求灵活处理,以降低维护成本、提升效率。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
复旦大学×阿里云产学合作协同育人合作案例
复旦大学联合阿里云开展“天池AI案例100开发”项目,赵卫东团队依托产业级平台构建“理论-实训-实战”教学新体系,开发4大综合性AI案例,覆盖图像识别、自然语言处理等方向。通过MOOC、教材、师资培训多渠道辐射全国,累计惠及超13万学习者,形成可复制的产教融合示范范式,推动人工智能人才培养与产业需求无缝对接。(238字)
134 5
|
4月前
|
存储 JSON API
发票信息管理接口技术指南
本文介绍如何构建基于RESTful的发票管理API,涵盖创建、查询、更新与删除功能。采用Python+Flask示例,实现JSON数据交互、金额自动计算、错误处理及安全优化,助力企业财务系统高效集成与扩展。(238字)
203 0
|
9月前
|
数据采集 人工智能 Ubuntu
MyEMS开源能源管理系统开发工具
MyEMS 是一款基于 ISO 50001 标准的开源能源管理系统,支持建筑、工厂等场景的电、水、气等能源数据采集与分析,提供光伏、储能、微电网、AI 优化等功能。系统采用开源工具开发,包括 PyCharm、VS Code、Docker、Ubuntu 等,并搭配 MySQL 数据库及 DBeaver 客户端,助力企业实现低碳发展。社区版完全免费,适合开发者学习和部署。下载地址:[https://gitee.com/myems/myems](./https://gitee.com/myems/myems)。
422 32
|
9月前
|
JavaScript 开发者 C++
HarmonyOS NEXT ArkUI生命周期终极指南 | 组件与页面的关系
本文是关于 HarmonyOS NEXT 中 ArkUI 生命周期的终极指南,深入解析组件与页面的关系及其生命周期特性。文章通过超全场景案例、隐藏技巧和避坑秘籍,帮助开发者轻松掌握生命周期管理。内容涵盖页面级(如 `onPageShow`、`onPageHide`)与组件级(如 `aboutToAppear`、`onDidBuild`)生命周期的区别与应用,并提供实战代码示例,包括基础版与高阶版用法。此外,还总结了十大避坑指南和神奇技巧,如实现页面停留统计与双击退出功能。掌握这些知识,助你精准控制 UI 更新,掌控组件与页面的生死轮回!
|
8月前
|
存储 人工智能 缓存
OSS与NAS混合云存储架构:非结构化数据统一管理实战
AI训练集管理面临数据规模爆炸与访问模式多样的挑战。传统单一存储方案存在成本高、访问慢等问题。创新混合架构融合OSS与NAS,实现热冷数据自动分层,降低存储成本62%,提升训练速度3.8倍。通过统一接口、智能调度与自动迁移,兼顾高性能与低成本,助力AI训练高效稳定运行。
402 0
|
开发框架 前端开发 JavaScript
【第16期】一文认识前端框架
【第16期】一文认识前端框架
335 0
|
存储 机器学习/深度学习
首个多模态连续学习综述,港中文、清华、UIC联合发布
多模态连续学习(MMCL)旨在使模型在不断学习新数据的同时,不遗忘已有知识。香港中文大学、清华大学和伊利诺伊大学芝加哥分校的研究人员发布了首个关于MMCL的全面综述。该综述介绍了MMCL的基本背景和设置,提出了基于正则化、架构、重放和提示四类方法的分类体系,并讨论了其挑战与未来研究方向。论文链接:https://arxiv.org/abs/2410.05352
308 28
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
557 9
|
消息中间件 分布式计算 大数据
数据为王:大数据处理与分析技术在企业决策中的力量
【10月更文挑战第29天】在信息爆炸的时代,大数据处理与分析技术为企业提供了前所未有的洞察力和决策支持。本文探讨了大数据技术在企业决策中的重要性和实际应用,包括数据的力量、实时分析、数据驱动的决策以及数据安全与隐私保护。通过这些技术,企业能够从海量数据中提取有价值的信息,预测市场趋势,优化业务流程,从而在竞争中占据优势。
686 2