SpringSecurity3 --- 认识SpringSecurity

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: SpringSecurity是一个强大的安全框架,提供认证和授权功能。它支持多种认证机制,如表单、OAuth2.0、SAML2.0、CAS、RememberMe、JAAS、OpenID和X509等。。。

1-SpringSecurity核心功能

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攻击等,可参照:

链接

2-SpringSecurity核心架构

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

1.过滤链

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

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

image.png

客户端(广义的前端)向应用程序(广义的后端)发送请求,容器根据请求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。

image.png

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中。

image.png

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

4.安全过滤链

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

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

image.png

下图显示了多个SecurityFilterChain实例

image.png

5.处理安全异常

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

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

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

image.png

首先,ExceptionTranslationFilter调用FilterChain.doFilter(request, response)应用程序的其余部分。
如果用户未经过身份验证或者是AuthenticationException,则开始身份验证。
SecurityContextHolder被清除
HttpServletRequest保存后以便在身份验证成功后可用于重放原始请求。
用于AuthenticationEntryPoint向客户端请求凭据。例如它可能会重定向到登录页面或发送WWW-Authenticate标头。
否则,如果它是AccessDeniedException,则Access Denied。调用AccessDeniedHandler来处理拒绝访问。

相关文章
|
数据采集 关系型数据库 MySQL
python-协程(async、await关键字与asyncio)
python-协程(async、await关键字与asyncio)
1433 0
|
安全 Java 数据库
三更草堂 Spring Security学习总结(思路整理)
Spring Security学习总结(思路整理)
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
1147 3
springboot整合springsecurity,从数据库中认证
|
存储 前端开发 搜索推荐
打造个性化网页计数器
【8月更文挑战第31天】本文带你一步步构建一个简单而独特的网页计数器,不仅记录访问量,还能展现你的个人风格。我们将从基础的HTML结构出发,逐步引入CSS美化和JavaScript实现动态效果,最后通过一个简单的后端服务完成数据的持久化。无论你是编程新手还是希望给你的网页添加一点趣味,这篇文章都会为你提供所需指导。
开发指南029-el-table-column对齐属性
按开发文档和正常理解,el-table-column具有属性align,可以填left,center,right控制内容的对齐方式
|
缓存 JavaScript 前端开发
vue3+elementplus后台管理系统,实现用户登录
vue3+elementplus后台管理系统,实现用户登录
|
存储 JSON 前端开发
jwt超详细配置和教程
jwt超详细配置和教程
410 2
解决IDEA中 Could not autowire. No beans of 'xxxx' type found 的错误提示
解决IDEA中 Could not autowire. No beans of 'xxxx' type found 的错误提示
12625 3
解决IDEA中 Could not autowire. No beans of 'xxxx' type found 的错误提示
|
JSON 前端开发 Java
|
NoSQL 安全 数据库
SpringSecurity-从入门到精通-学习完整笔记-附(完整demo源码)来自b站三更草堂老师的视频教程见下方链接
SpringSecurity-从入门到精通-学习完整笔记-附(完整demo源码)来自b站三更草堂老师的视频教程见下方链接
493 0