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 不同的身份验证未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
Maven Repository 上 4.1.1 中的 spring-security-web 在哪里?
使用 Active Directory 的 Spring Security 3.1
Spring Security 3.2.1 具有不同 WebSecurityConfigurerAdapters 的多个登录表单