认识SpringSecurity

简介: Spring Security 是成熟的安全框架,核心功能包括认证(支持表单、OAuth2、SAML等)、鉴权(URL、方法、SPEL等控制)及防御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来处理拒绝访问。
相关文章
|
XML Java 数据库连接
mybatis-plus逆向工程详解
mybatis-plus逆向工程详解
800 0
|
8月前
|
存储 Java Apache
Velocityd的使用
Apache Velocity 是一个高效的 Java 模板引擎,主要用于动态文本生成,如网页、邮件或配置文件。其核心概念包括模板(Template)、上下文(Context)和引擎(VelocityEngine)。模板包含静态内容与动态指令,通过上下文传入数据,由引擎解析生成最终输出。Velocity 语法简洁,支持变量、条件判断、循环等逻辑控制,适用于 Web 开发及后端渲染场景。在 Spring Boot 等框架中集成方便,但需注意路径配置、编码设置及兼容性问题。
537 1
|
6月前
|
安全 Java 数据库
SpringSecurity认证授权及项目集成
本文介绍了基于Spring Security的权限管理框架,涵盖认证、授权与鉴权核心概念,通过快速入门示例演示集成流程,并结合数据库实现用户认证。进一步扩展实现正常登录,JWT登录及鉴权管理器,实现灵活的安全控制,适用于前后端分离项目中的权限设计与实践。
598 4
|
8月前
|
存储 SQL 人工智能
MySQL 数据类型详解:字符串、数字、日期
在 MySQL 数据库设计中,选择合适的数据类型对存储效率和查询性能至关重要。本文详细介绍了字符串、数字和日期三大类数据类型及其子类型,帮助开发者根据业务需求做出更优选择。内容涵盖 CHAR 与 VARCHAR 的区别、TEXT 和 BLOB 的使用场景、整数与浮点类型的适用范围,以及日期时间类型的特性。通过最佳实践建议,提升数据库性能并避免常见问题。
432 4
|
3月前
|
存储 JSON NoSQL
MongoDB常用命令
本文介绍MongoDB数据库操作,包括创建与删除数据库、集合的显式与隐式创建、文档的增删改查、批量操作、分页查询及排序。以文章评论系统为例,演示数据存储结构及常用命令,涵盖insert、update、remove、find、limit、skip、sort等方法,帮助掌握MongoDB基本使用。
|
3月前
|
存储 消息中间件 开发框架
应用架构图
技术架构是将业务需求转化为技术实现的关键过程,涵盖分层设计、技术选型与系统集成。本文详解单体与分布式架构,包括展现层、业务层、数据层及基础层的职责,以及应用间调用关系、外部系统交互与边界划分,为构建清晰的技术体系提供指导。
 应用架构图
|
3月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文介绍如何使用Nacos实现配置中心及集群搭建。涵盖配置管理、热更新、共享配置、优先级规则,并通过Nginx实现高可用集群部署,提升微服务架构下配置的动态管理与系统稳定性。
Nacos配置中心
|
3月前
|
存储 Dubbo API
SpringCloud工程部署启
本文介绍SpringCloud微服务工程的搭建与部署,涵盖项目创建、数据库配置、服务启动及远程调用实现,通过RestTemplate完成服务间通信,帮助理解微服务拆分与协作机制。
SpringCloud工程部署启
|
3月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力用户全面掌握SQL使用情况,提升日志分析效率与治理能力。
如何做好SQL质量监控
|
3月前
|
负载均衡 Java 数据安全/隐私保护
Gateway服务网关
本文介绍了微服务架构中API网关的核心作用,包括请求路由、权限控制和限流等功能,重点讲解了Spring Cloud Gateway的快速搭建、路由配置、断言与过滤器工厂的使用,并通过实例演示了全局过滤器、跨域问题解决及过滤器执行顺序等关键技术点。

热门文章

最新文章