当前位置: 首页 > 科技观察

SpringSecurity的配置机制早就变了,你注意到了吗?

时间:2023-03-13 13:54:47 科技观察

胖哥之前说过SecurityConfigurerAdapter会在即将到来的5.7版本中失效。从SpringSecurity5.4开始,会提供一个原型作用域的HttpSecurity来帮助我们构建一个过滤链SecurityFilterChain:LazyPasswordEncoder(this.context);AuthenticationManagerBuilderauthenticationBuilder=newWebSecurityConfigurerAdapter.DefaultPasswordEncoderAuthenticationManagerBuilder(this.objectPostProcessor,passwordEncoder);authenticationBuilder.parentAuthenticationManager(authenticationManager());HttpSecurityhttp=newHttpSecurity(this.objectPostProcessor,authenticationBuilder,createSharedObjects());//@formatter:offhttp.csrf(withDefaults()).addFilter(newWebAsyncManagerIntegrationFilter()).exceptionHandling(withDefaults()).headers(withDefaults()).sessionManagement(withDefaults()).securityContext(withDefaults()).requestCache(withDefaults()).anonymous(withDefaults()).servletApi(withDefaults()).apply(newDefaultLoginPageConfigurer<>());http.logout(withDefaults());//@formatter:返回http;这里会构建一个基于原型的HttpSecurityBean,并初始化一些默认的配置供我们使用。日常涉及到SpringSecurity的开发都是围绕这门课展开的,所以这门课是学习SpringSecurity是重中之重。基于原型的SpringBean的典型应用场景。基本配置我们日常使用的一些配置项如下:方法说明requestMatchers()为SecurityFilterChain提供URL拦截策略,具体antMatcher和mvcMathceropenidLogin()用于基于OpenId的验证headers()在响应中添加安全header,如SimpleXSS防护cors()配置跨域资源共享(CORS)sessionManagement()配置会话管理portMapper()配置一个PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用PortMapper从HTTP重定向到HTTPS或从HTTPS重定向到HTTP。默认情况下,SpringSecurity使用PortMapperImpl将HTTP端口8080映射到HTTPS端口8443,将HTTP端口80映射到HTTPS端口443。jee()配置基于容器的预身份验证。在这种情况下,身份验证由Servlet容器管理x509()配置基于x509的预身份验证rememberMe配置“记住我”身份验证authorizeRequests()基于使用HttpServletRequest限制访问requestCache()配置请求缓存exceptionHandling()配置错误处理securityContext()在HttpServletRequest之间的SecurityContextHolder上设置SecurityContext的管理。使用WebSecurityConfigurerAdapter时,这将自动将HttpServletRequest的servletApi()方法及其上找到的值应用到SecurityContext中。当使用WebSecurityConfigurerAdapter时,这将自动应用csrf()来添加CSRF支持,而当使用WebSecurityConfigurerAdapter时,默认情况下将启用logout()以添加注销支持。这在使用WebSecurityConfigurerAdapter时自动应用。默认情况下,访问URL“/logout”,使HTTPSession无效以清除用户,清除任何配置的#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到/login?successanonymous()配置匿名用户的表示。这在与WebSecurityConfigurerAdapter结合使用时自动应用。默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色ROLE_ANONYMOUSAuthenticationManager()ConfigureAuthenticationManagerAuthenticationProvider()AddAuthenticationProviderformLogin()指定对基于表单的身份验证的支持。如果不指定FormLoginConfigurer#loginPage(String),将生成默认登录页面oauth2Login()配置基于外部OAuth2.0或OpenIDConnect1.0提供者的认证oauth2Client()OAuth2.0客户端相关配置oauth2ResourceServer()OAuth2.0资源服务器-specificconfigurationrequiresChannel()配置通道安全。要使此配置有用,必须至少提供一个到所需通道的映射httpBasic()配置HttpBasic身份验证addFilter()添加一个已在内置过滤器注册表中注册的过滤器实例或子类addFilterBefore()在指定的添加在Filter类之前的一个过滤器addFilterAt()在指定Filter类的位置添加一个过滤器addFilterAfter()在指定的Filter类之后添加一个过滤器and()将上述策略的连接器连接起来,组合安全策略。其实就是“和”的意思。进阶玩法的新手建议先选择性了解以上基础玩法,有精力再研究HttpSecurity的进阶玩法。apply方法用于将其他一些配置合并到当前配置中,形成一个插件,支持SecurityConfigurerAdapter或SecurityConfigurer的实现。实际上,一些内置的配置就是以这种形式集成到HttpSecurity中的。比如文章开头的配置中,有一个默认登录页面相关的配置:httpSecurity.apply(newDefaultLoginPageConfigurer<>());胖哥用这个做了一个扩展,支持小程序登录和验证码登录。spring-security-login-扩展。objectPostProcessor配置自定义ObjectPostProcessor。ObjectPostProcessor可以改变一些配置的内部机制,往往不直接对外提供操作接口。获取和移除配置类getConfigurer用于获取应用的配置类;getConfigurers用于获取某个类型的所有已应用的配置类。现在这是我最喜欢的自定义方式。SharedObject的配置与获取SharedObject是配置中共享的一些对象。HttpSecurity共享一些非常有用的对象,可以在配置之间共享,例如AuthenticationManager。相关方法有setSharedObject、getSharedObject、getSharedObjects。获取SecurityFilterChainHttpSecurity也提供了构造目标对象SecurityFilterChain实例的方法。第一次可以使用build()来构建配置;您还可以使用getObject()来获取构建的实例;您甚至可以使用getOrBuild()直接获取实例或构建实例。所以新的配置是这样的:@BeanSecurityFilterChainsecurityFilterChain(HttpSecurityhttp){http.cors();returnhttp.build();}请记住,每个HttpSecurity只能成功构建一次。这篇文章非常重要。这篇文章的内容非常重要。它不能立即掌握。需要一定的耐心,需要在使用和学习中去总结和发现。