Ho un'applicazione di avvio a molla in esecuzione con sicurezza Spring che utilizza l'autenticazione di base. Quando vengono fornite le credenziali di autenticazione di base corrette, tutto è buono, ma per le credenziali di autenticazione errate, spring genera un'eccezione HttpRequestMethodNotSupportedException: Request method 'POST' not supported
.Spring Security con autenticazione di base che reindirizza a/errore per credenziali non valide
Secondo i registri, l'errore di autenticazione è stato identificato in primavera, ma non è quello che viene fuori.
2015-08-12 09:33:10.922 INFO 16988 --- [nio-8080-exec-4] o.s.b.a.audit.listener.AuditListener : AuditEvent [timestamp=Wed Aug 12 09:33:10 AEST 2015, principal=anonymousUser, type=AUTHORIZATION_FAILURE, data={type=org.springframework.security.access.AccessDeniedException, message=Access is denied}] 2015-08-12 09:33:10.927 TRACE 16988 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Bound request context to thread: FirewalledRequest[ [email protected]] 2015-08-12 09:33:10.927 DEBUG 16988 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing POST request for [/myapplication/error] 2015-08-12 09:33:10.927 TRACE 16988 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Testing handler map [[email protected]331bb032] in DispatcherServlet with name 'dispatcherServlet' 2015-08-12 09:33:10.927 TRACE 16988 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping : No handler mapping found for [/error] 2015-08-12 09:33:10.927 TRACE 16988 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Testing handler map [org.s[email protected]69e79b9b] in DispatcherServlet with name 'dispatcherServlet' 2015-08-12 09:33:10.927 TRACE 16988 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Testing handler map [org.springframework[email protected]27cc0354] in DispatcherServlet with name 'dispatcherServlet' 2015-08-12 09:33:10.927 DEBUG 16988 --- [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error 2015-08-12 09:33:10.928 DEBUG 16988 --- [nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
Con i registri di cui sopra & dopo il debug la fonte di primavera, ho scoperto che su di identificazione che le credenziali non sono corrette, la primavera crea un'eccezione BadCredentials e poi tenta di reindirizzare a “/ errore”, il reindirizzamento è ciò che causa l'eccezione HttpMethodNotAllowed. (la mia applicazione non ha un endpoint/errore).
Ho cercato di dire la primavera di non usare/errore configurando quanto segue,
`ServerCustomization public class estende ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
super.customize(container);
container.addErrorPages(new ErrorPage(HttpStatus.UNAUTHORIZED, null));
}`
Questo farà tappa primaverile sputare fuori la HttpMethodnotallowed eccezione e rendere venire con un 401 (non autorizzato), MA questa mia eccezione non viene catturata dal mio gestore di eccezioni (configurato usando @ControllerAdvice
).
Ho anche provato a configurare un punto di ingresso di autenticazione personalizzato come di seguito senza alcuna fortuna.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
AlwaysSendUnauthorized401AuthenticationEntryPoint alwaysSendUnauthorized401AuthenticationEntryPoint =
new AlwaysSendUnauthorized401AuthenticationEntryPoint();
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers().httpStrictTransportSecurity().xssProtection().and().authorizeRequests().anyRequest().fullyAuthenticated()
.and().csrf().disable();
http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint);
}
public class AlwaysSendUnauthorized401AuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public final void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
}
C'è un modo siamo in grado di specificare di primavera non per reindirizzare a/errore e ritornare le credenziali Bad eccezione?
Grazie a @grigori per avermi indicato nella giusta direzione. C'era effettivamente un'implementazione non standard del BasicErrorController che stava causando il problema. L'utilizzo di un controller errori corretto ha risolto il problema. – DilanD
Grazie, per me il mvc-exclude lo ha risolto, a volte amo le impostazioni predefinite di SpringBoot, e talvolta no :) Ma questo mi ricorda di non fare una magia @EnableAutoConfiguration ma invece solo un sottoinsieme di specifiche * Configurazioni necessarie. –