Spring Security bypass-URL oder Filter

Ich habe eine Spring-Boot-Anwendung, ist, dass nur eine REST-API. Ich brauche, um es zu sichern, und ich bin mit einem token-basierten Ansatz ― speziell JWT.

So weit, dies ist, was ich umgesetzt haben:

//
//The Spring Security configuration class
@EnableGlobalAuthentication
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(final HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
          .antMatchers("/api/login", "/api/logout").permitAll()
          .antMatchers("/api/**").authenticated()
          .anyRequest().authenticated()
        .and()
          .addFilterBefore(new JwtFilter(), BasicAuthenticationFilter.class)
          .sessionManagement()
          .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }
}

//
//The JWT filter class to check for the token in the HTTP request (headers)
public final class JwtFilter extends GenericFilterBean {
  private final Logger logger = LoggerFactory.getLogger(this.getClass());

  @Override
  public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws
      IOException, ServletException {
    final HttpServletRequest req = (HttpServletRequest)request;
    final String header = req.getHeader("Authorization");

    logger.debug("{} {}", req.getMethod(), req.getRequestURI());
    if ((null == header) || !header.startsWith("Bearer ")) {
      logger.debug("Missing or invalid Authorization header");
    }
    try {
      //Check the token here; the implementation is not relevant here
      /*SecurityContextHolder.getContext()
          .setAuthentication(manager.authenticate(new JwtToken(JWTParser.parse(header.substring(7)))));*/
      chain.doFilter(request, response);
    } catch (final AuthenticationException e) {
      SecurityContextHolder.clearContext();
      //Do some other stuff here
    } catch (final ParseException e) { /* ... */ }
  }
}

Das Problem ist, dass der filter ordnungsgemäß ausgeführt wird, für jede einzelne URI, aber ich möchte in der Lage sein, bestimmte Endpunkte aus dem gleichen Satz. Mein API ist in diesem Kontext /api/* und ich möchte ausschließen, zum Beispiel /api/login und /api/logout.

HINWEIS: Meine Feder Boot application.yml - Datei nicht haben Einstellungen zu aktivieren/ändern von Sicherheitsfunktionen.

Haben Sie Ihren benutzerdefinierten filter, die die token-Verifizierung, bevor die Berechtigung filter im Lieferumfang von spring security. War das deine Absicht? Jetzt anmelden, trifft Sie Ihre filter, bevor es eine chance hat, zu Ihrem hit authentication filter. Ich würde erwarten, dass die token-Verifizierung Filter erst nach der Authentifizierung filter, weil Sie wahrscheinlich keine security-context, bevor Sie Ihre Autorisierungs-filter ausgeführt wird (es sei denn, Sie haben einen anderen auth-filter vor Ihrem jwt filter, die Sie nicht teilen hier).
login ist ein POST Betrieb, bei dem die Authentifizierung geschieht (überspringen Sie diesen nun, ob es eine gute oder schlecht, ich weiß, dass es schlecht zu implementieren, die es so in der RUHE). Ich möchte nur in der Lage sein zu schlagen login und logout ohne in den filter, der überprüft, ob der token. Alles andere wird standardmäßig gesperrt.
Wollen Sie es zu Ihrem hit-Authentifizierung filter? Wenn ja, bewegen Sie Ihre jwt filter nach der Authentifizierung filter und halten Sie Ihr alle zulassen, das sollte funktionieren.
Also, was muss ich ändern, in der das Stück code, dass es in der Antwort. Die Authentifizierung findet in einem Endpunkt (login), es ist keine Authentifizierung-filter.
.addFilterBefore(neue JwtFilter(), BasicAuthenticationFilter.class) --> .addFilterAfter(neue JwtFilter(), BasicAuthenticationFilter.class) ?

InformationsquelleAutor x80486 | 2016-03-09

Schreibe einen Kommentar