withDefaults()的目的是Spring Security

68bkxrlz  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(469)

根据Spring Security在Customizer的withDefaults()指示:
返回不更改输入参数的Customizer
但这到底意味着什么呢?
例如,如果我这样使用它,结果是什么:

@EnableWebSecurity
@Configuration
public class SecurityConfiguration {

   @Bean
   public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     http.csrf().disable()
         .authorizeHttpRequests((authz) -> authz.anyRequest().authenticated())
         .httpBasic(withDefaults());
     return http.build();
   }

}

字符串

os8fio9y

os8fio9y1#

根据java doc,我们有

public HttpSecurity httpBasic(Customizer<HttpBasicConfigurer<HttpSecurity>> httpBasicCustomizer) throws Exception {
            httpBasicCustomizer.customize((HttpBasicConfigurer)this.getOrApply(new HttpBasicConfigurer()));
            return this;
        }

字符串
该参数的类型为Customizer<HttpBasicConfigurer<HttpSecurity>>,它可以用作lambda函数,将您希望在配置器中应用的更改传递给httpBasic方法。此方法还返回构建的HttpSecurity,因此当httpBasic(....)方法结束时,配置器已经被应用。
一个相对于你的例子,让我们命名它Example 1

httpSecurity.httpBasic(httpSecurityHttpBasicConfigurer -> {
                          httpSecurityHttpBasicConfigurer.realmName("My Realm");
                          httpSecurityHttpBasicConfigurer.authenticationEntryPoint(new YourAuthEntryClass());
                          })
    .authorizeRequests().and().csrf().disable().authorizeHttpRequests((authz) -> authz.anyRequest().authenticated());


因此,配置者将通过您提供的lambda函数将realmNameauthenticationEntryPoint应用于httpSecurity
如果您不想在httpBasic方法中对httpSecurity进行任何修改,您也可以使用

httpSecurity.httpBasic(httpSecurityHttpBasicConfigurer -> {} )
       .authorizeRequests().and().csrf().disable().authorizeHttpRequests((authz) -> authz.anyRequest().authenticated());


Spring为了避免把这个不合理的httpSecurityHttpBasicConfigurer -> {}写成参数,在函数接口Customizer中也给了你这个静态withDefaults方法。请记住,这个Customizer只是一个通用的接口,并且将在其他地方使用,而不仅仅是在这里。

@FunctionalInterface
public interface Customizer<T> {
    void customize(T t);

    static <T> Customizer<T> withDefaults() {
        return (t) -> {
        };
    }
}


为了避免

httpSecurity.httpBasic(httpSecurityHttpBasicConfigurer -> {} )....


你也可以写

httpSecurity.httpBasic(Customizer.withDefaults())....


这意味着在httpSecurity对象中的httpBasic方法内部不会应用任何配置。

但是请记住,您还可以从Java Docs中获得另一种方法

public HttpBasicConfigurer<HttpSecurity> httpBasic() throws Exception {
                return (HttpBasicConfigurer)this.getOrApply(new HttpBasicConfigurer());
            }


它也可以被使用,它不会返回修改过的httpSecurity对象,而是返回一个HttpBasicConfigurer,它可以被写入为使用builder模式修改httpSecurity
因此,示例1现在可以写成

httpSecurity.httpBasic()
            .realmName("My Realm")
            .authenticationEntryPoint(new YourAuthEntryClass())
            .and().authorizeRequests().and().csrf().disable()
            .authorizeHttpRequests((authz) -> authz.anyRequest().authenticated());


如果您不想对httpSecurity应用任何基本的http配置更改,您可以跳过构建器模式中的realmNameauthenticationEntryPoint方法,它将再次为您提供httpSecurity的默认基本配置

httpSecurity.httpBasic()
                .and()
                .authorizeRequests().and().csrf().disable()
                .authorizeHttpRequests((authz) -> authz.anyRequest().authenticated());


这和

httpSecurity.httpBasic(Customizer.withDefaults())
                .authorizeRequests().and().csrf().disable()
                .authorizeHttpRequests((authz) -> authz.anyRequest().authenticated());

1u4esq0p

1u4esq0p2#

使用默认设置。
对于EX,
1.授权谁
1.如何授权

相关问题