Spring Security:回退到表单登录验证错误

时间:2018-02-20 12:18:01

标签: spring spring-security

我尝试实施类似于https://stackoverflow.com/a/33608459https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#multiple-httpsecurity

的SecurityConfig

我希望我的API(/rest/**)由HttpBasic保护,其他请求通过FormLogin保护。 这很有效......只要我向HttpBasic提供正确的凭据。

如果我提供正确的凭据 - 它会以正常答案回复 如果我提供没有凭据 - 它会以 401 Unauthorized 回复 - 完美! 如果我提供错误的凭据,则会使用 302 Found Location: /login 进行回复

最后一部分是我不想要的 - 我还想要一个错误凭据的 401 Unauthorized

示例请求:

  

http http://localhost:8081/rest/
   HTTP/1.1 401 WWW-Authenticate: Basic realm="My Realm"
  的 http -a correct:password http://localhost:8081/rest/some/api/
   HTTP/1.1 200
  的 http -a wrong:password http://localhost:8081/rest/some/api/
   HTTP/1.1 302 Location: http://hive.local:8081/login WWW-Authenticate: Basic realm="My Realm"

Java配置:

@Configuration
@Order(1)
public static class RestSecurityConfig extends WebSecurityConfigurerAdapter {
  @Autowired
  private AuthorizationProperties properties;

  @Override protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http.antMatcher("/rest/**")
      .authorizeRequests()
        .anyRequest().hasRole("API").and()
      .httpBasic()
        .realmName(properties.getRealm()).and()
      .formLogin().disable()
      .csrf().disable();
    // @formatter:on
  }
}

@Configuration
@Order(2)
public static class FrontendSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/app/**", "/webjars/**", "/static/**", "/js/**");
  }

  @Override protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
      .authorizeRequests()
        .anyRequest().hasAnyRole("USER").and()
      .formLogin();
    // @formatter:on
  }
}

1 个答案:

答案 0 :(得分:0)

我能够对此有所了解。

在基本身份验证请求失败后重定向到表单登录是由调度程序 servlet 在验证凭据失败后尝试重定向到 URL /error 引起的。

要获得适当的错误响应,您需要将 /error 添加到在您的网络安全配置中被忽略的 antMatchers