2017-12-25 8 views
0

Ich versuchte folgende this Tutorial und implementiert die Provider-Klasse wie im Beispiel angegeben.Filtermethode von JAX-RS Provider wird nie

@Provider 
@Secured 
@Priority(Priorities.AUTHENTICATION) 
public class AuthenticationFilter implements ContainerRequestFilter { 

    private static final String REALM = "example"; 
    private static final String AUTHENTICATION_SCHEME = "Bearer"; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     // Get the Authorization header from the request 
     String authorizationHeader = 
       requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); 

     // Validate the Authorization header 
     if (!isTokenBasedAuthentication(authorizationHeader)) { 
      abortWithUnauthorized(requestContext); 
      return; 
     } 

     // Extract the token from the Authorization header 
     String token = authorizationHeader 
          .substring(AUTHENTICATION_SCHEME.length()).trim(); 

     try { 

      // Validate the token 
      validateToken(token); 

     } catch (Exception e) { 
      abortWithUnauthorized(requestContext); 
     } 
    } 

    private boolean isTokenBasedAuthentication(String authorizationHeader) { 

     // Check if the Authorization header is valid 
     // It must not be null and must be prefixed with "Bearer" plus a whitespace 
     // The authentication scheme comparison must be case-insensitive 
     return authorizationHeader != null && authorizationHeader.toLowerCase() 
        .startsWith(AUTHENTICATION_SCHEME.toLowerCase() + " "); 
    } 

    private void abortWithUnauthorized(ContainerRequestContext requestContext) { 

     // Abort the filter chain with a 401 status code response 
     // The WWW-Authenticate header is sent along with the response 
     requestContext.abortWith(
       Response.status(Response.Status.UNAUTHORIZED) 
         .header(HttpHeaders.WWW_AUTHENTICATE, 
           AUTHENTICATION_SCHEME + " realm=\"" + REALM + "\"") 
         .build()); 
    } 

    private void validateToken(String token) throws Exception { 
     // Check if the token was issued by the server and if it's not expired 
     // Throw an Exception if the token is invalid 

     //TODO validate against database 
     if(!token.equals("exampleString")) { 
      throw new AuthenticationException("Invalid token."); 
     } 
    } 
} 

Diese Provider-Klasse wird auch vom Server erkannt, die in den Protokollen zu sehen ist:

Dez 25, 2017 6:47:09 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFORMATION: Root resource classes found: 
    class com.jwt.service.AuthenticationEndpoint 
    class com.jwt.service.HelloWorldService 
Dez 25, 2017 6:47:09 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFORMATION: Provider classes found: 
    class com.jwt.service.AuthenticationFilter 

ich eine Schnittstelle für die Anmerkung erstellt:

@NameBinding 
@Retention(RUNTIME) 
@Target({TYPE, METHOD}) 
public @interface Secured { 
} 

Und auch kommentierte mein REST-Endpunkt

Obwohl meine Provider-Klasse erkannt wird, tut sie immer noch nichts, wenn die annotierte Methode aufgerufen wird. Anstatt den unautorisierten Statuscode auszugeben, wird "Gesicherter getUser wird aufgerufen" zurückgegeben, obwohl keine Authentifizierung gesendet wurde.

Hat jemand eine Idee, warum die Filtermethode meiner Provider-Klasse nie aufgerufen wird?

+0

'com.sun.jersey.api' Paket ist Jersey 1, während das Tutorial, das Sie folgen folgt mit Jersey 2. Upgrade auf Jersey 2 oder finden Sie eine Lösung mit Jersey 1. – Rouliboy

+0

Nach dem Ändern meines Projekts Jersey 2 zu implementieren ist es arbeite jetzt, vielen Dank! :) – Fynn

+0

Großartig! Ich fügte eine Antwort hinzu, um Menschen mit gleichen Problemen zu helfen. – Rouliboy

Antwort

1

com.sun.jersey.api Paket (sichtbar in den bereitgestellten Protokollen) ist Jersey 1, während das Tutorial, das Sie folgen, befasst sich mit Jersey 2. Upgrade auf Jersey 2 und es wird funktionieren.