当前位置: 首页 > news >正文

中国国家住房和城乡建设部网站首页白云区是穷人区吗

中国国家住房和城乡建设部网站首页,白云区是穷人区吗,游戏推广员拉人犯法吗,昆明网页制作深入理解HttpSecurity的设计 一、HttpSecurity的应用 在前章节的介绍中我们讲解了基于配置文件的使用方式#xff0c;也就是如下的使用。 也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息#xff0c;但是在SpringBoot项目中#xff0c;我们慢慢脱离…深入理解HttpSecurity的设计 一、HttpSecurity的应用 在前章节的介绍中我们讲解了基于配置文件的使用方式也就是如下的使用。 也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息但是在SpringBoot项目中我们慢慢脱离了xml配置文件的方式在SpringSecurity中提供了HttpSecurity等工具类这里HttpSecurity就等同于我们在配置文件中定义的http标签。要使用的话方式如下。 通过代码结果来看和配置文件的效果是一样的。基于配置文件的方式我们之前分析过是通过标签对应的handler来解析处理的那么HttpSecurity这块是如何处理的呢我们来详细分析下。 二、HttpSecurity的类图结构 可以看出HttpSecurity的类图结构相对比较简单继承了一个父类实现了两个接口。我们分别来看看他们的作用是什么 1.SecurityBuilder接口 我们先来看看SecurityBuilder接口通过字面含义我们就可以发现这是一个帮我们创建对象的工具类。 public interface SecurityBuilderO {/*** Builds the object and returns it or null.* return the Object to be built or null if the implementation allows it.* throws Exception if an error occurred when building the Object*/O build() throws Exception;}通过源码我们可以看到在SecurityBuilder中给我们提供了一个build()方法。在接口名称处声明了一个泛型而build()方法返回的正好是这个泛型的对象其实就很好理解了也就是SecurityBuilder会创建指定类型的对象。结合HttpSecurity中实现SecurityBuilder接口时指定的泛型我们可以看出创建的具体对象是什么类型。 可以看出SecurityBuilder会通过build方法给我们创建一个DefaultSecurityFilterChain对象。也就是拦截请求的那个默认的过滤器链对象。 然后进入到doBuild()方法会进入到AbstractConfiguredSecurityBuilder中的方法 Overrideprotected final O doBuild() throws Exception {synchronized (this.configurers) {this.buildState BuildState.INITIALIZING;beforeInit();init();this.buildState BuildState.CONFIGURING;beforeConfigure();configure();this.buildState BuildState.BUILDING;// 获取构建的对象上面的方法可以先忽略O result performBuild();this.buildState BuildState.BUILT;return result;}}进入到HttpSecurity中可以查看performBuild()方法的具体实现。 Overrideprotected DefaultSecurityFilterChain performBuild() {// 对所有的过滤器做排序this.filters.sort(OrderComparator.INSTANCE);ListFilter sortedFilters new ArrayList(this.filters.size());for (Filter filter : this.filters) {sortedFilters.add(((OrderedFilter) filter).filter);}// 然后生成 DefaultSecurityFilterChainreturn new DefaultSecurityFilterChain(this.requestMatcher, sortedFilters);}在构造方法中绑定了对应的请求匹配器和过滤器集合。 对应的请求匹配器则是 AnyRequestMatcher 匹配所有的请求。当然我们会比较关心默认的过滤器链中的过滤器是哪来的这块儿我们继续来分析。 2.AbstractConfiguredSecurityBuilder 然后我们再来看看AbstractConfiguredSecurityBuilder这个抽象类他其实是SecurityBuilder的实现在这儿需要搞清楚他们的关系。 类型作用SecurityBuilder声明了build方法AbstractSecurityBuilder提供了获取对象的方法以及控制一个对象只能build一次AbstractConfiguredSecurityBuilder除了提供对对象细粒度的控制外还扩展了对configurer的操作 然后对应的三个实现类。 首先 AbstractConfiguredSecurityBuilder 中定义了一个枚举类将整个构建过程分为 5 种状态也可 以理解为构建过程生命周期的五个阶段如下 private enum BuildState {/*** 还没开始构建*/UNBUILT(0),/*** 构建中*/INITIALIZING(1),/*** 配置中*/CONFIGURING(2),/*** 构建中*/BUILDING(3),/*** 构建完成*/BUILT(4);private final int order;BuildState(int order) {this.order order;}public boolean isInitializing() {return INITIALIZING.order this.order;}/*** Determines if the state is CONFIGURING or later* return*/public boolean isConfigured() {return this.order CONFIGURING.order;}}通过这些状态来管理需要构建的对象的不同阶段。 2.1 add方法 AbstractConfiguredSecurityBuilder中方法概览 我们先来看看add方法。 private C extends SecurityConfigurerO, B void add(C configurer) {Assert.notNull(configurer, configurer cannot be null);Class? extends SecurityConfigurerO, B clazz (Class? extends SecurityConfigurerO, B) configurer.getClass();synchronized (this.configurers) {if (this.buildState.isConfigured()) {throw new IllegalStateException(Cannot apply configurer to already built object);}ListSecurityConfigurerO, B configs null;if (this.allowConfigurersOfSameType) {configs this.configurers.get(clazz);}configs (configs ! null) ? configs : new ArrayList(1);configs.add(configurer);this.configurers.put(clazz, configs);if (this.buildState.isInitializing()) {this.configurersAddedInInitializing.add(configurer);}}}/*** Gets all the {link SecurityConfigurer} instances by its class name or an empty* List if not found. Note that object hierarchies are not considered.* param clazz the {link SecurityConfigurer} class to look for* return a list of {link SecurityConfigurer}s for further customization*/SuppressWarnings(unchecked)public C extends SecurityConfigurerO, B ListC getConfigurers(ClassC clazz) {ListC configs (ListC) this.configurers.get(clazz);if (configs null) {return new ArrayList();}return new ArrayList(configs);}add 方法这相当于是在收集所有的配置类。将所有的 xxxConfigure 收集起来存储到 configurers 中将来再统一初始化并配置configurers 本身是一个 LinkedHashMap key 是配置类的 class value 是一个集合集合里边放着 xxxConfigure 配置类。当需要对这些配置类进行集中配置的时候 会通过 getConfigurers 方法获取配置类这个获取过程就是把 LinkedHashMap 中的 value 拿出来 放到一个集合中返回。 2.2 doBuild方法 然后来看看doBuild方法中的代码 Overrideprotected final O doBuild() throws Exception {synchronized (this.configurers) {this.buildState BuildState.INITIALIZING;beforeInit(); //是一个预留方法没有任何实现init(); // 就是找到所有的 xxxConfigure挨个调用其 init 方法进行初始化this.buildState BuildState.CONFIGURING;beforeConfigure(); // 是一个预留方法没有任何实现configure(); // 就是找到所有的 xxxConfigure挨个调用其 configure 方法进行配置。this.buildState BuildState.BUILDING;O result performBuild(); // 是真正的过滤器链构建方法但是在 AbstractConfiguredSecurityBuilder中 performBuild 方法只是一个抽象方法具体的实现在 HttpSecurity 中this.buildState BuildState.BUILT;return result;}}init方法:完成所有相关过滤器的初始化 private void init() throws Exception {CollectionSecurityConfigurerO, B configurers getConfigurers();for (SecurityConfigurerO, B configurer : configurers) {configurer.init((B) this); // 初始化对应的过滤器}for (SecurityConfigurerO, B configurer : this.configurersAddedInInitializing) {configurer.init((B) this);}}configure方法完成HttpSecurity和对应的过滤器的绑定。 private void configure() throws Exception {CollectionSecurityConfigurerO, B configurers getConfigurers();for (SecurityConfigurerO, B configurer : configurers) {configurer.configure((B) this);}}3.HttpSecurity HttpSecurity 做的事情就是进行各种各样的 xxxConfigurer 配置 HttpSecurity 中有大量类似的方法过滤器链中的过滤器就是这样一个一个配置的。我们就不一一介绍 了。每个配置方法的结尾都会来一句 getOrApply这个是干嘛的我们来看下 private C extends SecurityConfigurerAdapterDefaultSecurityFilterChain, HttpSecurity C getOrApply(C configurer)throws Exception {C existingConfig (C) getConfigurer(configurer.getClass());if (existingConfig ! null) {return existingConfig;}return apply(configurer);}getConfigurer 方法是在它的父类 AbstractConfiguredSecurityBuilder 中定义的目的就是去查看当前 这个 xxxConfigurer 是否已经配置过了。   如果当前 xxxConfigurer 已经配置过了则直接返回否则调用 apply 方法这个 apply 方法最终会调 用到 AbstractConfiguredSecurityBuilder#add 方法将当前配置 configurer 收集起来 HttpSecurity 中还有一个 addFilter 方法. Overridepublic HttpSecurity addFilter(Filter filter) {Integer order this.filterOrders.getOrder(filter.getClass());if (order null) {throw new IllegalArgumentException(The Filter class filter.getClass().getName() does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.);}this.filters.add(new OrderedFilter(filter, order));return this;}这个 addFilter 方法的作用主要是在各个 xxxConfigurer 进行配置的时候会调用到这个方法 xxxConfigurer 就是用来配置过滤器的把 Filter 都添加到 fitlers 变量中。 小结这就是 HttpSecurity 的一个大致工作流程。把握住了这个工作流程剩下的就只是一些简单的重 复的 xxxConfigurer 配置了
http://www.w-s-a.com/news/932076/

相关文章:

  • 跟知乎一样的网站做展示网站步骤
  • 邯郸网站建设效果好wordpress app 加载慢
  • 做app的网站有哪些功能广州自适应网站建设
  • 兰州建设网站的网站开源网站建设
  • 深圳网站建设南山指数基金是什么意思
  • 备案中又需要建设网站网站信息组织优化
  • 做网站推广需要什么asp响应式h5网站源码下载
  • 柳州建设网官方网站免费自助建站哪个平台好
  • 论坛网站模板源码下载网站建设与网页设计是什么
  • 跑流量的网站淘宝网站的建设目标是
  • 网站计费系统怎么做九一制作网站
  • 网红营销推广温州seo博客
  • 临沂网站制作定制现在比较流行的软件开发模型
  • 南宁企业建站系统做问卷调查哪个网站好
  • 能打开各种网站的浏览器推荐建设部的网站首页
  • 苏州高端网站建设开发wordpress 删除图片
  • saas网站开发外贸网站设计风格
  • c 手机网站开发湘阴网页定制
  • 阿里云虚拟主机搭建wordpressWordPress优化手机端
  • 湖北长安建设网站衡阳市做网站
  • 灯饰网站建设图片深圳做网站哪家公司好
  • 网站的构造有什么网站做生鲜配送的
  • 怎么在手机上做微电影网站小马厂网站建设
  • 网络广告投放网站中山网
  • 保定网站制作专业网页设计模板html代码运行
  • 中国专利申请网官网杭州seo优化
  • 杭州低价做网站网站系统功能流程图
  • 档案室建设网站名贵中药材初加工平台
  • 怎么做优惠券的网站wordpress加载速度
  • 手机网站 分辨率如何创建网站挣钱