分享更有价值
被信任是一种快乐

怎么理解SecurityConfigurer

文章页正文上

这篇文章主要讲解了“怎么理解SecurityConfigurer”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解SecurityConfigurer”吧!1. SecurityConfigurerSecurityConfigurer本身是一个接口,我们来看下:可以看到,SecurityConfigurer 中主要是两个方法,init 和 configure。init 就是一个初始化方法。而 configure 则是一个配置方法。这里只是规范了方法的定义,具体的实现则在不同的实现类中。需要注意的是这两个方法的参数类型都是一个泛型 B,也就是 SecurityBuilder 的子类,关于 SecurityBuilder ,它是用来构建过滤器链的,松哥将在下篇文章中和大家介绍。SecurityConfigurer 有三个实现类:SecurityConfigurerAdapterGlobalAuthenticationConfigurerAdapterWebSecurityConfigurer我们分别来看。1.1 SecurityConfigurerAdapterSecurityConfigurerAdapter实现了 SecurityConfigurer 接口,我们所使用的大部分的 xxxConfigurer 也都是 SecurityConfigurerAdapter 的子类。SecurityConfigurerAdapter 在 SecurityConfigurer 的基础上,还扩展出来了几个非常好用的方法,我们一起来看下:鸿蒙官方战略合作共建——HarmonyOS技术社区CompositeObjectPostProcessor 首先一开始声明了一个 CompositeObjectPostProcessor 实例,CompositeObjectPostProcessor 是 ObjectPostPro免费云主机、域名cessor 的一个实现,ObjectPostProcessor 本身是一个后置处理器,该后置处理器默认有两个实现,AutowireBeanFactoryObjectPostProcessor 和 CompositeObjectPostProcessor。其中 AutowireBeanFactoryObjectPostProcessor 主要是利用了 AutowireCapableBeanFactory 对 Bean 进行手动注册,因为在 Spring Security 中,很多对象都是手动 new 出来的,这些 new 出来的对象和容器没有任何关系,利用 AutowireCapableBeanFactory 可以将这些手动 new 出来的对象注入到容器中,而 AutowireBeanFactoryObjectPostProcessor 的主要作用就是完成这件事;CompositeObjectPostProcessor 则是一个复合的对象处理器,里边维护了一个 List 集合,这个 List 集合中,大部分情况下只存储一条数据,那就是 AutowireBeanFactoryObjectPostProcessor,用来完成对象注入到容器的操作,如果用户自己手动调用了 addObjectPostProcessor 方法,那么 CompositeObjectPostProcessor 集合中维护的数据就会多出来一条,在 CompositeObjectPostProcessor#postProcess 方法中,会遍历集合中的所有 ObjectPostProcessor,挨个调用其 postProcess 方法对对象进行后置处理。and 方法,该方法返回值是一个 securityBuilder,securityBuilder 实际上就是 HttpSecurity,我们在 HttpSecurity 中去配置不同的过滤器时,可以使用 and 方法进行链式配置,就是因为这里定义了 and 方法并返回了 securityBuilder 实例。这便是 SecurityConfigurerAdapter 的主要功能,后面大部分的 xxxConfigurer 都是基于此类来实现的。1.2 GlobalAuthenticationConfigurerAdapterGlobalAuthenticationConfigurerAdapter 看名字就知道是一个跟全局配置有关的东西,它本身实现了 SecurityConfigurerAdapter 接口,但是并未对方法做具体的实现,只是将泛型具体化了:可以看到,SecurityConfigurer 中的泛型,现在明确成了 AuthenticationManager 和 AuthenticationManagerBuilder。所以 GlobalAuthenticationConfigurerAdapter 的实现类将来主要是和配置 AuthenticationManager 有关。当然也包括默认的用户名密码也是由它的实现类来进行配置的。我们在 Spring Security 中使用的 AuthenticationManager 其实可以分为两种,一种是局部的,另一种是全局的,这里主要是全局的配置。1.3 WebSecurityConfigurer还有一个实现类就是 WebSecurityConfigurer,这个可能有的小伙伴比较陌生,其实他就是我们天天用的 WebSecurityConfigurerAdapter 的父接口。所以 WebSecurityConfigurer 的作用就很明确了,用户扩展用户自定义的配置。SecurityConfigurer 默认主要是这三个实现,考虑到大多数的过滤器配置都是通过 SecurityConfigurerAdapter 进行扩展的,因此我们今天就通过这条线进行展开。另外两条线松哥也将撸两篇文章和大家介绍。2. SecurityConfigurerAdapterSecurityConfigurerAdapter 的实现主要也是三大类:UserDetailsAwareConfigurerAbstractHttpConfigurerLdapAuthenticationProviderConfigurer考虑到 LDAP 现在使用很少,所以这里我来和大家重点介绍下前两个。2.1 UserDetailsAwareConfigurer这个配置类看名字大概就知道这是用来配置用户类的。AbstractDaoAuthenticationConfigurerAbstractDaoAuthenticationConfigurer 中所做的事情比较简单,主要是构造了一个默认的 DaoAuthenticationProvider,并为其配置 PasswordEncoder 和 UserDetailsService。UserDetailsServiceConfigurerUserDetailsServiceConfigurer 重写了 AbstractDaoAuthenticationConfigurer 中的 configure 方法,在 configure 方法执行之前加入了 initUserDetailsService 方法,以方便开发展按照自己的方式去初始化 UserDetailsService。不过这里的 initUserDetailsService 方法是空方法。UserDetailsManagerConfigurerUserDetailsManagerConfigurer 中实现了 UserDetailsServiceConfigurer 中定义的 initUserDetailsService 方法,具体的实现逻辑就是将 UserDetailsBuilder 所构建出来的 UserDetails 以及提前准备好的 UserDetails 中的用户存储到 UserDetailsService 中。该类同时添加了 withUser 方法用来添加用户,同时还增加了一个 UserDetailsBuilder 用来构建用户,这些逻辑都比较简单,小伙伴们可以自行查看。JdbcUserDetailsManagerConfigurerJdbcUserDetailsManagerConfigurer 在父类的基础上补充了 DataSource 对象,同时还提供了相应的数据库查询方法。InMemoryUserDetailsManagerConfigurerInMemoryUserDetailsManagerConfigurer 在父类的基础上重写了构造方法,将父类中的 UserDetailsService 实例定义为 InMemoryUserDetailsManager。DaoAuthenticationConfigurerDaoAuthenticationConfigurer 继承自 AbstractDaoAuthenticationConfigurer,只是在构造方法中修改了一下 userDetailsService 而已。有小伙伴可能要问了,JdbcUserDetailsManagerConfigurer 或者 InMemoryUserDetailsManagerConfigurer,到底在哪里可以用到呀?松哥给大家举一个简单的例子:当你调用 auth.inMemoryAuthentication 进行配置时,实际上调用的就是 InMemoryUserDetailsManagerConfigurer。这下明白了吧!2.2 AbstractHttpConfigurerAbstractHttpConfigurer 这一派中的东西非常多,我们所有的过滤器配置,都是它的子类,我们来看下都有哪些类?可以看到,它的实现类还是非常多的。这么多实现类,松哥就不一一给大家介绍了,我挑一个常用的 FormLoginConfigurer 来给大家详细介绍,只要大家把这个理解了,其他的照猫画虎就很好理解了。我们一个一个来看。2.2.1 AbstractHttpConfigurerAbstractHttpConfigurer 继承自 SecurityConfigurerAdapter,并增加了两个方法,disable 和 withObjectPostProcessor:这两个方法松哥之前都有给大家介绍过,disable 基本上是大家的老熟人了,我们常用的 .csrf().disable() 就是出自这里,那么从这里我们也可以看到 disable 的实现原理,就是从 getBuilder 中移除相关的 xxxConfigurer,getBuilder 方法获取到的实际上就是 HttpSecurity,所以移除掉 xxxConfigurer 实际上就是从过滤器链中移除掉某一个过滤器,例如 .csrf().disable() 就是移除掉处理 csrf 的过滤器。另一个增加的方法是 withObjectPostProcessor,这是为配置类添加手动添加后置处理器的。在 AbstractHttpConfigurer 的父类中其实有一个类似的方法就是 addObjectPostProcessor,但是 addObjectPostProcessor 只是一个添加方法,返回值为 void,而 withObjectPostProcessor 的返回值是当前配置类,也就是 xxxConfigurer,所以如果使用 withObjectPostProcessor 的话,可以使用链式配置,事实上,在松哥之前的文章,以及 vhr(https://github.com/lenve/vhr) 项目中,使用的也都是 withObjectPostProcessor 方法(当然,你也可以使用 addObjectPostProcessor,最终效果是一样的)。2.2.2 AbstractAuthenticationFilterConfigurerAbstractAuthenticationFilterConfigurer 类的功能比较多,源码也是相当相当长。不过我们只需要抓住两点即可,init 方法和 configure 方法,因为这两个方法是所有 xxxConfigurer 的灵魂。init 方法主要干了三件事:鸿蒙官方战略合作共建——HarmonyOS技术社区updateAuthenticationDefaults 主要是配置了登录处理地址,失败跳转地址,注销成功跳转地址。updateAccessDefaults 方法主要是对 loginPage、loginProcessingUrl、failureUrl 进行 permitAll 设置(如果用户配置了 permitAll 的话)。registerDefaultAuthenticationEntryPoint 则是注册异常的处理器。再来看 configure 方法:configure 中的逻辑就很简答了,构建各种各样的回调函数设置给 authFilter,authFilter 再去 postProcess 中走一圈注册到 Spring 容器中,最后再把 authFilter 添加到过滤器链中。这便是 AbstractAuthenticationFilterConfigurer 的主要功能。需要提醒大家的是,我们日常配置的,如:loginPageloginProcessingUrlpermitAlldefaultSuccessUrlfailureUrl…等方法都是在这里定义的。最后我们再来看看 FormLoginConfigurer。2.2.3 FormLoginConfigurerFormLoginConfigurer 在定义是,明确了 AbstractAuthenticationFilterConfigurer 中的泛型是 UsernamePasswordAuthenticationFilter,也就是我们这里最终要配置的过滤是 UsernamePasswordAuthenticationFilter。FormLoginConfigurer 重写了 init 方法,配置了一下默认的登录页面。其他的基本上都是从父类来的,未做太多改变。另外我们日常配置的很多东西也是来自这里:感谢各位的阅读,以上就是“怎么理解SecurityConfigurer”的内容了,经过本文的学习后,相信大家对怎么理解SecurityConfigurer这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: Python类对象的JSON序列化处理方法是什么

这篇文章主要介绍“Python类对象的JSON序列化处理方法是什么”,在日常操作中,相信很多人在Python类对象的JSON序列化处理方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python类对象的JSON序列化处理…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册