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

我想学做网站鞍山信息港招聘信息网

我想学做网站,鞍山信息港招聘信息网,长沙网站设计培训学校,网页版扫一扫二维码Spring-Security HttpSecurity Spring-Security全局导读#xff1a; 1、Security核心类设计 2、HttpSecurity结构和执行流程解读 3、Spring-Security个人落地篇 背景#xff1a; Spring-Security框架的核心架构上一篇已经概述#xff0c;展示其执行流程及逻辑#xff0c;但…Spring-Security HttpSecurity Spring-Security全局导读 1、Security核心类设计 2、HttpSecurity结构和执行流程解读 3、Spring-Security个人落地篇 背景 Spring-Security框架的核心架构上一篇已经概述展示其执行流程及逻辑但是和我们实际使用有点差距相信大家在使用此框架时肯定被以下代码迷惑过 Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().formLogin().disable().authorizeRequests().antMatchers(HttpMethod.OPTIONS).permitAll().anyRequest().authenticated().and().logout().logoutSuccessHandler(authResult).permitAll().and().exceptionHandling().authenticationEntryPoint(authResult);} }上述代码直接看就是一串httpSecurity对象的链式配置但很多问题没有还需明确 1、HttpSecurity可以设置哪些配置点? 重点配置有哪些 2、链条中为什么需要add方法是否必须 3、每个配置点底层以何种形式存在执行时机或顺序如何定义 4、HttpSecurity除了链式配置外还需要哪些配置 5、在适配模式下使用重写的configure方法何时执行 6、HttpSecurity在何处以何种方式被使用的 下面将在以上问题的基础上对HttpSecurity做自我理解后的解读 基础条件 1、SpringBoot的Web项目【版本2.7.14】 2、集成相关spring-security的starter依赖 解答一、HttpSecurity的由来 上下文自动配置类 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration 引入Security注解开关 org.springframework.security.config.annotation.web.configuration.EnableWebSecurity 传递关系(依次由上到下): SecurityAutoConfigurationSpringBootWebSecurityConfigurationWebSecurityEnablerConfigurationEnableWebSecurity 进而引入Security框架核心类的配置类 AuthenticationConfiguration AuthenticationManager管理类 WebSecurityConfiguration WebSecurity配置类 HttpSecurityConfiguration HttpSecurity配置类 HttpSecurity创建代码简化版 Configuration(proxyBeanMethods false ) class HttpSecurityConfiguration {private ObjectPostProcessorObject objectPostProcessor; // 框架类初始化增强类后续单独讲private AuthenticationManager authenticationManager; // 授权管理器核心依赖类可自定义可系统自动配置后续单独讲private AuthenticationConfiguration authenticationConfiguration; // 授权管理器配置类作为父授权管理器托底private ApplicationContext context;Scope(prototype)Bean({org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity})HttpSecurity httpSecurity() throws Exception {WebSecurityConfigurerAdapter.LazyPasswordEncoder passwordEncoder new WebSecurityConfigurerAdapter.LazyPasswordEncoder(this.context);// 创建授权管理器构建类parent设置时可以全局搜索我们自定义的AuthenticationProvider类就不用通过构建器手工设置AuthenticationManagerBuilder authenticationBuilder new WebSecurityConfigurerAdapter.DefaultPasswordEncoderAuthenticationManagerBuilder(this.objectPostProcessor, passwordEncoder);authenticationBuilder.parentAuthenticationManager(this.authenticationManager());// 实例化HttpSecurityHttpSecurity http new HttpSecurity(this.objectPostProcessor, authenticationBuilder, this.createSharedObjects());// 初始化HttpSecurity安全管理逻辑如logout、登录页、异常等场景设置都是默认配置做到开箱即用http.csrf(Customizer.withDefaults()).addFilter(new WebAsyncManagerIntegrationFilter()).exceptionHandling(Customizer.withDefaults()).headers(Customizer.withDefaults()).sessionManagement(Customizer.withDefaults()).securityContext(Customizer.withDefaults()).requestCache(Customizer.withDefaults()).anonymous(Customizer.withDefaults()).servletApi(Customizer.withDefaults()).apply(new DefaultLoginPageConfigurer());http.logout(Customizer.withDefaults()); this.applyDefaultConfigurers(http); // SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader) -- 默认factories加载实现类忽略 return http;}private AuthenticationManager authenticationManager() throws Exception {return this.authenticationManager ! null ? this.authenticationManager : this.authenticationConfiguration.getAuthenticationManager();}// HttpSecurity内部全局共享实例集合核心类都会在此保存并重复使用private MapClass?, Object createSharedObjects() {MapClass?, Object sharedObjects new HashMap();sharedObjects.put(ApplicationContext.class, this.context);return sharedObjects;} }除代码中标注的注释外还需要注意 1、注意HttpSecurity上Bean发布范围是多例因为可以Proxy下可以配置多个过滤器链注如果在不同类或同一个类的不同地方多次引用相关配置会错乱除非自己另行全局封装 2、AuthenticationManager是部分Filter的核心依赖尤其涉及我们自定义鉴权部分的代码其主旨为拦截后对接口具体的参数处理与返回也就是我们的鉴权逻辑。 解答二HttpSecurity结构之配置与构建过程 作为一个框架的核心类HttpSecurity的设计完成应用了多个巧妙的设计模式使代码可读性、复用性更高。 核心设计模式一构建器模式 构建器模式是最常见的创建型模式在类相关实例变量相当多的场景下非常实用避免长列表或多重载构造函数。在Security框架中安全策略多样每个安全策略需要管理的参数量不固定且灵活性较高隐含意思是HttpSecurity配置安全策略及安全策略配置具体参数都适用此场景实际security框架就是这么设计和干的如果采用常见if…else…语法配置及使用过程将毫无人性构建器模式让HttpSecurity的链式配置更加易读和使用。 Spring6中将配置器的创建改成lambda形式进一步缩短HttpSecurity的配置层次将配置器的创建与HttpSecurity的配置解耦这就是框架的魅力。构建器模式代码结构很简单难点在于安全知识点的理解与调控开发过程中注意参数变化导致的配置器的失效问题下面将简单列举来进一步说明 1、图中1处的logout无参方法返回配置器Configurer的实例对象我们通过配置内部构建方法进一步配置其他参数值结束配置可用HttpSecurity另起一行配置新的配置器或者使用logout配置器的and方法继续链式配置其他配置器 2、图中2处的logout有参方法提供了一个自定义构造器参数可以对系统默认的Configurer实例做进一步配置可对象可由lambda表达式代替Spring6已经全面像此场景靠拢部分人对过长的HttpSecurity链无感 配置器操作中其实隐含一个非常重要的操作可以看到图中的getOrApply方法。该方法一方面将Configurer实例添加到HttpSecurity的全局缓存中并将HttpSecurity的实例对象的引用传递进原Configurer内部做到相交相融还有将Configurer从普通new出的实例进一步提级完成类似spring容器里的实例对象的生命周期的管理。根据反馈效果后续可追加解读。 核心设计模式二模板模式 模板模式常用在继承结构HttpSecurity继承了AbstractConfiguredSecurityBuilder - AbstractSecurityBuilder抽象类该抽象类将构建方法完全委托给实现类完成已知实现类有HttpSecurity、WebSecurity、AuthenticationManagerBuilder可以看到这三个类正是Security框架的核心。模板模式特点之xxx - doXxx构建过程如下 protected final O doBuild() throws Exception {synchronized(this.configurers) {this.buildState AbstractConfiguredSecurityBuilder.BuildState.INITIALIZING;this.beforeInit();this.init();this.buildState AbstractConfiguredSecurityBuilder.BuildState.CONFIGURING;this.beforeConfigure();this.configure();this.buildState AbstractConfiguredSecurityBuilder.BuildState.BUILDING;O result this.performBuild();this.buildState AbstractConfiguredSecurityBuilder.BuildState.BUILT;return result;} }构建流程说明 1、beforeInit() 尴尬三个实现类都忽略了 2、init() 执行所有安全配置器的初始化代码即configurer.init(HttpSecurity) 3、beforeConfigure() 授权管理器实例化并添加到sharedObjects集合AuthenticationManagerBuilder在此构建后状态标记已变更不可重新变更只能获取并使用。构建后的实例可以注入到HttpSecurity中可以创建Filter的配置器中自定义安全Filter需要人工或特殊配置来设置。这块有一定的操作空间 4、configure() 这个方法和init方法相辅相成前面已经完成各配置器的初始化现完成调用各配置器Configurer的configure方法逐一完成对HttpSecurity的配置。(此块即完成security框架内部Filter的添加例LogoutFilter) 5、performBuild() HttpSecurity构建的结果就是SecurityFilterChain对象此对象的功能就是用来管理security内部Filter集合创建逻辑也很简单new DefaultSecurityFilterChain(this.requestMatcher, sortedFilters)。关于SecurityFilterChain的介绍请点击并移步至此篇。 概要说明 1、构建流程的入口是我们HttpSecurity.build方法该方法可由我们主动触发在WebSecurityConfigurerAdapter适配器模式下由框架触发 2、授权管理器用来鉴权逻辑所以一般配置器生产的Filter实例可不用配置必要的Filter也会做检查。授权管理器对应的构建器在代码里有一定的操作空间其构建状态影响较大。 3、添加到HttpSecurity的内部安全Filter有很多这些Filter不影响我们正常使用的ApplicationFilterChain的执行流程各Filter在集合中的顺序有默认顺序详见FilterOrderRegistration包含所有内部过滤器清单及Order自定义Filter可通过HttpSecurity.addFilterBefore/After等方法指定。 总结 通过上述两大设计模式对Security框架的解读文章开篇的几个问题基本都涵盖了自己可以对照着解读根据问题和自己的理解去源码中进一步验证再来一遍debug基本就可以结束了。下面文章将根据这两篇前缀直接出一个完整的个人版落地篇也就是我们实际使用这个框架的内容了。 PS还有一个重要流程其实没有阐述就是上一篇的FilterChainProxy与本篇的HttpSecurity构建的SecurityFilterChain对象是如何绑定的其答案为WebSecurity通过控制HttpSecurity的配置与构建过程生成SecurityFilterChain在对应构建方法中使用FilterChainProxy包装进而发布到外部ApplicationFilterChain过滤器链中。如果感兴趣以后有机会再开篇详解。
http://www.zqtcl.cn/news/654379/

相关文章:

  • html教程 pdf网站建设优化兰州
  • 招聘网站可以同时做两份简历吗外贸网站示例
  • 黑链 对网站的影响企业融资计划书范本
  • 自己的简历怎么制作网站学院网站建设成效
  • 周口seo 网站郑州建站网站的公司
  • 网站布局模板北京装修大概多少钱一平方
  • 德阳网站建设ghxhwl风景网站模板
  • 昌邑网站建设拓者设计吧现代效果图
  • 学校网站建设成功案例网站开发需要学习哪些内容
  • 怎么让公司建设网站seo于刷网站点击
  • 网站建设合同严瑾建设网站宣传
  • 哪个网站做餐饮推广最好深圳市信任网站
  • 网站模板 整站源码广州网站vi设计报价
  • 百度速页建站wordpress审核插件
  • 怎么给网站wordpress专业的vi设计公司
  • 百度关键词在线优化寻找郑州网站优化公司
  • 网站建设适合什么单位网络推广员工作内容
  • 漂亮的网站维护页面wordpress加个微信登录
  • 网站设计是什么意思创建地址怎么弄
  • nas上建设网站文章网站哪里建设好
  • 消防网站模板广告设计专业需要学什么
  • 建设银行网站首页wordpress 登录函数
  • 做网站多长时间广州营销网站制作
  • 美团外卖网站开发建设网站如何写文案
  • 专门做画册封面的网站开发工程师网站开发工程师招聘
  • 广州市建设局网站自己做电影网站违法
  • 网站建设首选公司大丰专业做网站
  • 用dw怎么做网站辽宁省住房和城乡建设厅网站首页
  • 如何用微信小程序做网站2个网站做的链接怎么用一个域名
  • 大理网站建设滇icp备凡科网站代码如何修改