我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Security中WebSecurity和HttpSecurity的关系是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Security中WebSecurity和HttpSecurity的关系是什么

这篇文章给大家分享的是有关Spring Security中WebSecurity和HttpSecurity的关系是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前几天有粉丝私信我:WebSecurity和HttpSecurity啥关系?当时给我问住了,我大概只知道它们之间的关系类似TypeScript和JavaScript的关系,但是具体的细节确实不太清楚。因此就在周末简单研究了一下。

HttpSecurity的本质

前几天在Spring Security 5.4的新玩法中介绍了一种新的配置HttpSecurity的方式:

@Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception {     return http             .antMatcher("/**")             .authorizeRequests(authorize -> authorize                     .anyRequest().authenticated()             )             .build(); }

其实就能够知道HttpSecurity是用来构建包含了一系列过滤器链的过滤器SecurityFilterChain,平常我们的配置就是围绕构建SecurityFilterChain进行。还得拿出这张老图:

Spring Security中WebSecurity和HttpSecurity的关系是什么

安全过滤链

从上面这个图中可以看出构建好的还要交给FilterChainProxy来代理,是不是有点多此一举?

WebSecurity的本质

在有些情况下这种确实多此一举, 不过更多时候我们可能需要配置多个SecurityFilterChain来实现对多种访问控制策略。

Spring Security中WebSecurity和HttpSecurity的关系是什么

多个SecurityFilterChain

为了精细化的管理多个SecurityFilterChain的生命周期,搞一个统一管理这些SecurityFilterChain的代理就十分必要了,这就是WebSecurity的意义。下面是WebSecurity的build方法的底层逻辑:

@Override protected Filter performBuild() throws Exception {    Assert.state(!this.securityFilterChainBuilders.isEmpty(),          () -> "At least one SecurityBuilder<? extends SecurityFilterChain> needs to be specified. "                + "Typically this is done by exposing a SecurityFilterChain bean "                + "or by adding a @Configuration that extends WebSecurityConfigurerAdapter. "                + "More advanced users can invoke " + WebSecurity.class.getSimpleName()                + ".addSecurityFilterChainBuilder directly");     // 被忽略请求的个数 和 httpscurity的个数 构成了过滤器链集合的大小    int chainSize = this.ignoredRequests.size() + this.securityFilterChainBuilders.size();    List<SecurityFilterChain> securityFilterChains = new ArrayList<>(chainSize);     // 初始化过滤器链集合中的 忽略请求过滤器链         for (RequestMatcher ignoredRequest : this.ignoredRequests) {       securityFilterChains.add(new DefaultSecurityFilterChain(ignoredRequest));    }     // 初始化过滤器链集合中的 httpsecurity定义的过滤器链    for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) {       securityFilterChains.add(securityFilterChainBuilder.build());    }    FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains);    if (this.httpFirewall != null) {        // 请求防火墙       filterChainProxy.setFirewall(this.httpFirewall);    }    if (this.requestRejectedHandler != null) {        // 请求拒绝处理器       filterChainProxy.setRequestRejectedHandler(this.requestRejectedHandler);    }    filterChainProxy.afterPropertiesSet();     Filter result = filterChainProxy;    if (this.debugEnabled) {       this.logger.warn("\n\n" + "********************************************************************\n"             + "**********        Security debugging is enabled.       *************\n"             + "**********    This may include sensitive information.  *************\n"             + "**********      Do not use in a production system!     *************\n"             + "********************************************************************\n\n");       result = new DebugFilter(filterChainProxy);    }    this.postBuildAction.run();    return result; }

从上面中的源码可以看出,WebSecurity用来构建一个名为springSecurityFilterChain的Spring  BeanFilterChainProxy  。它的作用是来定义那些请求忽略安全控制,那些请求必须安全控制,在合适的时候清除SecurityContext以避免内存泄漏,同时也可以用来定义请求防火墙和请求拒绝处理器,另外我们开启Spring  Seuciry Debug模式也是这里配置的。

同时还有一个作用可能是其它文章没有提及的,FilterChainProxy是Spring Security对Spring  framework应用的唯一出口,然后通过它与一个Servlet在Spring的桥接代理DelegatingFilterProxy结合构成Spring对Servlet体系的唯一出口。这样就将Spring  Security、Spring framework、Servlet API三者隔离了起来。

感谢各位的阅读!关于“Spring Security中WebSecurity和HttpSecurity的关系是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring Security中WebSecurity和HttpSecurity的关系是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Cloud和Spring Boot的关系是什么

这篇文章主要介绍了Spring Cloud和Spring Boot的关系是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud是什么?SpringCloud官网:http://spring.ioSp
2023-06-14

spring中多个contextConfigLocation的关系是什么

在Spring中,可以通过设置多个contextConfigLocation来加载多个配置文件。当设置多个contextConfigLocation时,Spring将会创建多个ApplicationContext对象,每个对象对应一个配置
2023-10-27

Android中View.post和Handler.post的关系是什么

这篇文章主要介绍“Android中View.post和Handler.post的关系是什么”,在日常操作中,相信很多人在Android中View.post和Handler.post的关系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好
2023-06-30

python中类和对象的关系是什么

在Python中,类是对象的蓝图或模板,而对象是类的实例。类定义了对象的属性和方法。通过创建一个对象,可以使用类中定义的属性和方法。可以将类视为一种数据类型,而对象是该数据类型的实例。类定义了对象的属性,这些属性可以是实例变量(即对象的特定
2023-09-15

git和github的关系是什么

本篇内容介绍了“git和github的关系是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!git和github的关系是:github是基
2023-07-02

tensorflow和keras的关系是什么

TensorFlow是一个用于构建和训练深度学习模型的开源库,而Keras是一个高级神经网络API,可以在TensorFlow等后端上运行。Keras可以被认为是TensorFlow的一个更加友好和易用的接口,使得深度学习模型的设计和训练更
tensorflow和keras的关系是什么
2024-03-12

opencv和ffmpeg的关系是什么

OpenCV和FFmpeg是两个不同的开源项目,它们都是用于处理图像和视频的库。OpenCV是一个用于计算机视觉和机器学习的库,提供了许多用于处理图像和视频的函数和算法。而FFmpeg是一个用于处理音频和视频的跨平台解决方案,它可以进行音视
2023-10-20

java和javascript的关系是什么

本篇内容介绍了“java和javascript的关系是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 和 JavaScript
2023-06-20

reactnative和react的关系是什么

React Native是基于React开发的一种移动应用开发框架。它允许开发者使用React的语法和组件模型来构建原生移动应用。React Native利用了React的虚拟DOM技术,将React组件转化为原生组件,从而实现了跨平台的开
2023-10-08

springboot和mybatis的关系是什么

Spring Boot和MyBatis的关系是,Spring Boot是一个用于简化Spring应用程序开发的框架,而MyBatis是一个开源的持久层框架。Spring Boot可以与MyBatis结合使用,以提供数据库访问和持久层操作的能
2023-10-11

java中线程和进程的关系是什么

这期内容当中小编将会给大家带来有关java中线程和进程的关系是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3.
2023-06-14

编程热搜

目录