Spring Boot Security nicht werfen 401 Unauthorized Ausnahme, sondern 404 Nicht Gefunden
Meine Authentifizierung basiert auf einem spring-boot-Sicherheit-Beispiel.
Wenn ich geben Sie ein ungültiges token, würde ich mag zu werfen, einen 401-Unauthorized-exception. Jedoch bekomme ich immer eine 404-Ressource nicht gefunden statt. Meine Konfiguration wird ein exception-handling, aber es wird ignoriert - wahrscheinlich, weil meine AuthenticationFilter Hinzugefügt wird, bevor und die Anforderung nicht erreichen, meine exception-handler.
Was würde ich ändern müssen, werfen 401 Ausnahmen statt?
Habe ich eine Authentifizierung filter:
public class AuthenticationFilter extends GenericFilterBean {
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = asHttp(request);
HttpServletResponse httpResponse = asHttp(response);
Optional<String> token = Optional.fromNullable(httpRequest.getHeader("X-Auth-Token"));
try {
if (token.isPresent()) {
logger.debug("Trying to authenticate user by X-Auth-Token method. Token: {}", token);
processTokenAuthentication(token);
addSessionContextToLogging();
}
logger.debug("AuthenticationFilter is passing request down the filter chain");
chain.doFilter(request, response);
} catch (InternalAuthenticationServiceException internalAuthenticationServiceException) {
SecurityContextHolder.clearContext();
logger.error("Internal authentication service exception", internalAuthenticationServiceException);
httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} catch (AuthenticationException authenticationException) {
SecurityContextHolder.clearContext();
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, authenticationException.getMessage());
} finally {
MDC.remove(TOKEN_SESSION_KEY);
MDC.remove(USER_SESSION_KEY);
}
}
private void addSessionContextToLogging() {
...
}
...
private void processTokenAuthentication(Optional<String> token) {
Authentication resultOfAuthentication = tryToAuthenticateWithToken(token);
SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);
}
private Authentication tryToAuthenticateWithToken(Optional<String> token) {
PreAuthenticatedAuthenticationToken requestAuthentication = new PreAuthenticatedAuthenticationToken(token, null);
return tryToAuthenticate(requestAuthentication);
}
private Authentication tryToAuthenticate(Authentication requestAuthentication) {
Authentication responseAuthentication = authenticationManager.authenticate(requestAuthentication);
if (responseAuthentication == null || !responseAuthentication.isAuthenticated()) {
throw new InternalAuthenticationServiceException("Unable to authenticate Domain User for provided credentials");
}
logger.debug("User successfully authenticated");
return responseAuthentication;
}
einen AuthenticationProvider Umsetzung:
@Provider
public class TokenAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
Optional<String> token = (Optional) authentication.getPrincipal();
if (!token.isPresent() || token.get().isEmpty()) {
throw new BadCredentialsException("No token set.");
}
if (!myCheckHere()){
throw new BadCredentialsException("Invalid token");
}
return new PreAuthenticatedAuthenticationToken(myConsumerObject, null, AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_API_USER"));
}
...
}
und einer Konfiguration, die aussieht wie folgt:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
and().
anonymous().disable().
exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint());
http.addFilterBefore(new AuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(tokenAuthenticationProvider());
}
@Bean
public AuthenticationProvider tokenAuthenticationProvider() {
return new TokenAuthenticationProvider();
}
@Bean
public AuthenticationEntryPoint unauthorizedEntryPoint() {
return (request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
InformationsquelleAutor Frame91 | 2016-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Antwort in diesem thread: Rückgabe HTTP-Fehler 401-Code & Skip Filter Ketten
Statt
Muss ich anrufen
Scheint es, wie die Kette Stoppt, wenn ich nicht weiterhin fordern, und durch einstellen des status auf einen anderen code - die exception, die geworfen wird, richtig
InformationsquelleAutor Frame91
Ich löste es durch hinzufügen der folgenden Anmerkung auf meiner top-level -
@SpringBootApplication
Klasse:Könnte Spring-Boot-Schwierigkeiten haben werden, Ihre Standard-Fehler-Seite?
InformationsquelleAutor candide
Zusätzlich zu den oben genannten Antwort, ich meine modifizierten code zu erreichen, 401, zuvor bekam ich 500 auf eine ungültige oder fehlende token.
}
InformationsquelleAutor Aditya Parmar