4.认识SpringSecurity

简介: Spring Security 是基于过滤器链的成熟安全框架,提供认证、鉴权及防御 CSRF 等攻击的核心功能,支持多种认证方式与灵活的权限控制模型。

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月前
|
缓存 Java Nacos
@RefreshScope热更新原理
本文深入解析Spring Cloud中@RefreshScope注解实现配置热更新的原理。通过分析其组合注解特性,重点剖析@Scope("refresh")如何借助动态代理与缓存机制,在配置变更时触发Bean重建,结合Nacos实现配置自动刷新,从而达到无需重启应用即可生效的效果。
@RefreshScope热更新原理
|
2月前
|
API 数据库 uml
如何写好一篇技术方案
本项目旨在升级知识库基础能力,优化目录与文档管理分离、拖拽交互不流畅等问题,提升用户体验。涵盖需求背景、功能模块、流程图、API及数据库设计,并通过图表与排期卡明确开发计划,助力团队高效协作推进。
 如何写好一篇技术方案
|
2月前
|
存储 安全 小程序
1.认识OAuth2.0
OAuth2.0是一种开放授权标准,允许第三方应用在用户授权下安全访问资源,无需获取用户账号密码。其核心是通过令牌(token)实现有限授权,广泛用于第三方登录、服务间资源调用等场景,支持授权码、简化、密码和客户端四种模式,兼顾安全性与灵活性。
 1.认识OAuth2.0
|
2月前
|
存储 缓存 算法
IO/线程 零拷贝
实现文件传输时,传统方法因频繁的上下文切换和内存拷贝导致性能低下。零拷贝技术通过减少系统调用和内存复制,提升传输效率,尤其适用于小文件。对于大文件,宜采用异步IO结合直接IO,避免PageCache负面影响,从而优化高并发场景下的性能表现。
|
2月前
|
缓存 Java 数据库连接
MyBatis常见配置
本文介绍MyBatis核心配置,包括属性加载优先级(方法参数 > resource/url > properties元素)、常用配置项如缓存、延迟加载、执行器类型,以及多环境配置与事务管理(JDBC/MAINTAINED),适用于多数据源场景。
|
2月前
|
监控 算法 Unix
IO/线程 Thread.sleep(0) 到底有什么用(读完就懂)
本文深入解析Thread.Sleep的原理与应用,结合操作系统调度机制,揭示Sleep(1000)未必准时唤醒、Sleep(0)主动让出CPU等行为的本质,帮助开发者正确理解线程休眠与CPU竞争的关系。
|
3月前
|
人工智能 运维 Cloud Native
一起聊聊大规模 AI Agent 部署与运维实战
诚挚地邀请您参加将于 11 月 28 日(周五)下午,在北京阿里中心举办的 【企业 AI 原生应用架构升级】主题研讨会。
|
2月前
|
存储 人工智能 运维
云栖实录:重构可观测 - 打造大模型驱动的云监控 2.0 与 AIOps 新范式
大模型时代驱动智能运维变革,阿里云通过统一可观测平台、UModel数字孪生与AIOps Agent,实现数据、认知、决策的全链路升级,重构运维新范式。
416 0
|
3月前
|
机器学习/深度学习 人工智能 API
构建AI智能体:二十四、RAG的高效召回方法论:提升RAG系统召回率的三大策略实践
本文探讨了检索增强生成(RAG)系统中的高效召回技术。RAG系统通过检索相关文档增强大语言模型的回答质量,但性能受制于垃圾进,垃圾出原则。为提高召回效果,文章重点分析了三种方法:Small-to-Big通过大小文本块映射兼顾检索精度与上下文丰富度;索引扩展(如HyDE)利用大模型生成假设文档来优化检索;双向改写弥合用户查询与文档表述的差异。这些方法从不同角度解决了RAG系统中的语义鸿沟、词汇不匹配等核心问题,可单独或组合使用。高效召回技术能显著提升RAG系统的回答质量和效率。
550 5
|
4月前
|
存储 人工智能 运维
日志服务&云监控全新发布,共筑企业智能运维新范式
阿里云推出Operation Intelligence新范式,通过日志服务SLS与云监控2.0,实现从感知、认知到行动闭环,推动运维迈向自决策时代。
373 1
日志服务&云监控全新发布,共筑企业智能运维新范式