Spring 2 Web Security 不同的身份验证未按预期工作

Posted

技术标签:

【中文标题】Spring 2 Web Security 不同的身份验证未按预期工作【英文标题】:Spring 2 WebSecurity different Authentifications not working as intended 【发布时间】:2021-04-17 10:18:10 【问题描述】:

我目前正在努力使用 Spring 的 WebSecurityConfig。我确实有一项受 IPAuthProvider 保护的服务(只有列入白名单的 IP 可以访问该服务)。出于监控原因,我公开了一个 /prometheus 端点,我不想在那里使用 IPAuth,而只需要基本身份验证。但是,以下代码将 IPAuth AND Basic Auth 添加到 /prometheus 端点。

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(securedEnabled = true)
    public class SecurityConfig 
    
        @Order(2)
        @Configuration
        public static class WebSecurityConfig extends WebSecurityConfigurerAdapter 
    
            private final IpAuth ipAuth;
            private final CustomAuthenticationFailureHandler failureHandler;
            private final CustomAuthenticationSuccessHandler successHandler;
    
            public WebSecurityConfig(IpAuth ipAuth,
                                    CustomAuthenticationFailureHandler failureHandler, CustomAuthenticationSuccessHandler successHandler) 
                this.ipAuth = ipAuth;
                this.failureHandler = failureHandler;
                this.successHandler = successHandler;
            
    
    
            @Override
            protected void configure(HttpSecurity http) throws Exception 
                http
                    .authorizeRequests()
                    .antMatchers(HttpMethod.POST, "/refresh")
                    .permitAll()
                    .antMatchers("/css/*.css", "/js/*.js")
                    .permitAll()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/loginPage")
                    .failureHandler(failureHandler)
                    .successHandler(successHandler)
                    .and()
                    .logout()
                    .logoutUrl("/logoutPage")
                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID")
                    .permitAll()
                    .and()
                    .csrf()
                    .disable();
            
    
            @Override
            public void configure(AuthenticationManagerBuilder auth) 
                auth.authenticationProvider(ipAuth);
            
    
    
        
    
        @Order(1)
        @Configuration
        public static class PrometheusConfig extends WebSecurityConfigurerAdapter
    
            private final PrometheusEntryPoint prometheusEntryPoint;
    
            public PrometheusConfig(SystemConfig systemConfig, PrometheusAuthEntryPoint prometheusAuthEntryPoint)
                this.prometheusAuthEntryPoint=prometheusAuthEntryPoint;
                this.systemConfig = systemConfig;
    
            
    
    
            @Override
            protected void configure(HttpSecurity http) throws Exception
                
                http
                    .antMatcher("/prometheus")
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .httpBasic()
                        .authenticationEntryPoint(prometheusAuthEntryPoint);
    
            
       

非常感谢任何帮助或提示,我 我真的卡在了这一点上。

提前致谢!

【问题讨论】:

您需要将 prometheus endoint 在您的第二个安全性中列入白名单,因为您已添加 anyRequest().authenticated()。否则它也会受到影响。添加.antMatcher("/prometheus").permittAll() 不幸的是没有解决问题,由于ipAuth,请求仍然被拒绝 顺便说一句:/refresh 没有问题,我真的很困惑为什么它不适用于 /prometheus 【参考方案1】:

您可以配置 WebSecurityConfig 以处理所有不以 /prometheus 开头的请求。

httpSecurity
     .regexMatcher("^(?!/prometheus/).*$")
     .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/refresh")
                .permitAll()
                .antMatchers("/css/*.css", "/js/*.js")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .loginPage("/loginPage")
                .failureHandler(failureHandler)
                .successHandler(successHandler)
                .and()
                .logout()
                .logoutUrl("/logoutPage")
                .invalidateHttpSession(true)
                .deleteCookies("JSESSIONID")
                .permitAll()
                .and()
                .csrf()
                .disable();

【讨论】:

不幸的是,该解决方案也存在问题

以上是关于Spring 2 Web Security 不同的身份验证未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Spring security中每个请求的不同csrf令牌

Maven Repository 上 4.1.1 中的 spring-security-web 在哪里?

spring-security框架

使用 Active Directory 的 Spring Security 3.1

spring security之web应用安全

Spring Security 3.2.1 具有不同 WebSecurityConfigurerAdapters 的多个登录表单