我尝试实施类似于https://stackoverflow.com/a/33608459和https://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"
@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
}
}
答案 0 :(得分:0)
我能够对此有所了解。
在基本身份验证请求失败后重定向到表单登录是由调度程序 servlet 在验证凭据失败后尝试重定向到 URL /error
引起的。
要获得适当的错误响应,您需要将 /error
添加到在您的网络安全配置中被忽略的 antMatchers
。