2017-10-23 2 views
1

Ich habe die unten Endpunkt Muster in meiner AnwendungVerwenden AbstractAuthenticationProcessingFilter für mehrere URLs

  1. /Token - für alle zugänglich
  2. /rest/securedone/** - erfordert Authentifizierung
  3. /rest/securedtwo/** - erfordert Authentifizierung
  4. /rest/ungesicherten/** - erfordert keine Authentifizierung

Ab sofort I Ich kann auf den/token-Endpunkt zugreifen. Aber/rest/secondedone/** und/rest/ungesichert/** 401 zurückgeben, wenn kein Token (JWT) gesendet wird. Es ist meine Absicht zu sichern/Ruhe/secondedone/** und das ist in Ordnung/Ruhe/ungesichert/** sollte zugänglich sein.

Meine httpSecurity Config ist wie folgt:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .cors() 
      .and() 
      .csrf().disable() 
      .authorizeRequests() 
       .antMatchers("/token").permitAll() 
       .antMatchers("/rest/secured/**").authenticated() 
      .and() 
      .exceptionHandling() 
       .authenticationEntryPoint(authenticationEntryPoint) 
      .and() 
       .sessionManagement() 
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS); 

    http.addFilterBefore(authenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class); 

    http.headers().cacheControl(); 
} 

und meine AbstractAuthenticationProcessingFilter erweiterte Klasse ist wie folgt:

public class MyAuthenticationTokenFilter extends AbstractAuthenticationProcessingFilter { 

private static Logger log = LoggerFactory.getLogger(MyAuthenticationTokenFilter.class); 

public MyAuthenticationTokenFilter() { super("/rest/**"); } 

@Override 
public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws AuthenticationException, ServletException { 
    //authentication handling code 
} 


@Override 
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { 
    super.successfulAuthentication(request, response, chain, authResult); 
    chain.doFilter(request, response); 
} 
} 

Kann jemand bitte meine Figur aus der unten helfen:

  1. Wann wird der MyAuthenticationTokenFilter verwendet? Für welche URL wird es aufgerufen? Wie kommt es, dass/rest/ungesichert/** ebenfalls eine Authentifizierung erwartet? Es passiert sogar, wenn ich explizit .antMatchers ("/ rest/secured/**"). PermitAll() sage. I

  2. Kann ich mehrere URL-Muster in meinem Super-Aufruf (defaultFilterProcessingUrl) im MyAuthenticationTokenFilter-Konstruktor angeben? Zum Beispiel, wenn ich eine andere URL wie/api/secured/habe, wie kann ich meinen MyAuthenticationTokenFilter für/api/secured/ Anfragen aufgerufen bekommen? Ich brauche keine andere Authentifizierungsbehandlung, daher möchte ich diesen Filter wiederverwenden.

Antwort

0

Wenn die MyAuthenticationTokenFilter verwendet?

Dieser Filter wird mit der Anforderung mit Client-Anmeldeinformationen für die Bearbeitung, wird die URL-Filter, wenn die RequestMatcher die Anforderungs-URL entspricht, zum Beispiel in Ihrer Konfiguration, wird die URL behandeln, die /rest/** einstimmt, und versucht, Konvertieren Sie die Client-Anmeldeinformationen in Authentication (z. B. userInfo, Rolle ...), löst es möglicherweise eine Ausnahme bei der Anfrage mit falschen Client-Anmeldeinformationen aus. Es ist anders zu authorizeRequests (xxx.authenticated() oder xxx.permit()), authorizeRequests nur überprüfen, ob die Authentifizierung einige spezielle Attribute (z. B. Rolle, Umfang) hat.

Als Analogie, AbstractAuthenticationProcessingFilter legt nur einige Karten (Authentication) in einen Kasten (SecurityContext) von verschiedenen Clients, überprüfen authorizeRequests nur die Box die Karte hat, dass es erforderlich ist, oder es wird die Anfrage ablehnen. AbstractAuthenticationProcessingFilter egal, wer/wie die Karten zu verwenden, und authorizeRequests ist es egal, woher die Karten kommen.

Kann ich mehrere URL-Muster in meinem Super-Aufruf (defaultFilterProcessingUrl) im MyAuthenticationTokenFilter-Konstruktor angeben?

Ja, können Sie die requiresAuthenticationRequestMatcher von setRequiresAuthenticationRequestMatcher gesetzt ist, wird es das alte requiresAuthenticationRequestMatcher, beispielsweise außer Kraft setzen,

authenticationTokenFilter 
    .setRequiresAuthenticationRequestMatcher(new OrRequestMatcher(                      
     new AntPathRequestMatcher("/rest/secured/**")                     
     , new AntPathRequestMatcher("/api/secured/**")                    
    )); 
+0

Dank einer Tonne für die vereinfachte Erklärung und Ihre Zeit. Ich denke, ich habe jetzt ein verfestigteres Verständnis davon. – worldbeater

Verwandte Themen