Mam aplikację rozruchu sprężynowego działającą z zabezpieczeniem sprężynowym za pomocą podstawowego uwierzytelniania. Po dostarczeniu prawidłowych podstawowych poświadczeń uwierzytelniających wszystko jest w porządku, ale w przypadku nieprawidłowych poświadczeń uwierzytelniających, wiosna przedstawia wyjątek od HttpRequestMethodNotSupportedException: Request method 'POST' not supported
.Zabezpieczenia sprężynowe z podstawowym przekierowaniem do/błędem w przypadku nieprawidłowych poświadczeń
Zgodnie z dziennikami, błąd uwierzytelnienia został zidentyfikowany wiosną, ale nie jest to zgodne z oczekiwaniami.
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
Z powyższych logów & po debugowania źródła sprężyny, okazało się, że przy identyfikowaniu że poświadczenia są niepoprawne, wiosna tworzy wyjątek BadCredentials a następnie próbuje przekierować na „/ błąd”, to przekierowanie jest przyczyną wyjątku HttpMethodNotAllowed. (moja aplikacja nie ma punktu końcowego/błędu).
próbowałem powiedzieć sprężynę nie używać/błąd poprzez skonfigurowanie następujących,
`public class ServerCustomization rozciąga ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
super.customize(container);
container.addErrorPages(new ErrorPage(HttpStatus.UNAUTHORIZED, null));
}`
To pozwoli zatrzymać wiosna wypluwając z HttpMethodnotallowed wyjątek i sprawiają, że wymyślić 401 (nieautoryzowane), ale mój wyjątek nie jest przechwytywany przez mój moduł obsługi wyjątków (skonfigurowany przy użyciu @ControllerAdvice
).
Próbowałem także skonfigurować niestandardowy punkt wejścia do uwierzytelniania, jak poniżej, bez żadnego szczęścia.
@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);
}
}
}
Czy istnieje jakiś sposób możemy określić, do wiosny nie przekierować do/błędu i powrócić zły Poświadczenia wyjątek?
Dzięki @grigori za skierowanie mnie we właściwym kierunku. Istniała nietypowa implementacja kontrolera BasicErrorController, który powodował problem. Użycie odpowiedniego kontrolera błędu naprawiło problem. – DilanD
Dzięki, dla mnie mvc-exclude naprawił to, czasami uwielbiam defaults SpringBoot, a czasem nie :) Ale to przypomina mi nie robienie magicznej @EnableAutoConfiguration ale zamiast tego tylko podzbiór specjalnie potrzebnych * konfiguracji. –