2013-06-12 12 views
5

Ich versuche, Benutzer mit einem JAX-RS-Filter zu authentifizieren, was bisher scheint zu funktionieren. Dies ist der Filter, wo ich ein neues Security bin Einstellung:Autorisierung mit RolesAllowedDynamicFeature und Jersey

@Provider 
public class AuthenticationFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(final ContainerRequestContext requestContext) throws IOException { 

    requestContext.setSecurityContext(new SecurityContext() { 
     @Override 
     public Principal getUserPrincipal() { 
     return new Principal() { 
      @Override 
      public String getName() { 
      return "Joe"; 
      } 
     }; 
     } 

     @Override 
     public boolean isUserInRole(String string) { 
     return false; 
     } 

     @Override 
     public boolean isSecure() { 
     return requestContext.getSecurityContext().isSecure(); 
     } 

     @Override 
     public String getAuthenticationScheme() { 
     return requestContext.getSecurityContext().getAuthenticationScheme(); 
     } 
    }); 

    if (!isAuthenticated(requestContext)) { 
     requestContext.abortWith(
       Response.status(Status.UNAUTHORIZED) 
       .header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Example\"") 
       .entity("Login required.").build()); 
    } 
    } 

    private boolean isAuthenticated(final ContainerRequestContext requestContext) { 
    return requestContext.getHeaderString("authorization") != null; // simplified 
    } 
} 

Die Ressource Methode sieht wie folgt aus:

@GET 
    // @RolesAllowed("user") 
    public Viewable get(@Context SecurityContext context) { 
    System.out.println(context.getUserPrincipal().getName()); 
    System.out.println(context.isUserInRole("user")); 
    return new Viewable("index"); 
    } 

Die RolesAllowedDynamicFeature wird wie folgt registriert:

.register(RolesAllowedDynamicFeature.class) 

ich kann Sehen Sie sich die erwarteten Ausgaben auf der Konsole an. Aber wenn ich @RolesAllowed("user") auskommentiere, erhalte ich einen Forbidden Fehler und die isUserInRole Methode meines SecurityContext wird nie genannt. Nach dem API doc sollte RolesAllowedDynamicFeature diese Methode aufrufen.

Wie kann ich RolesAllowedDynamicFeature verwenden?

Antwort

1

Ich denke, es wegen

@Override 
    public boolean isUserInRole(String string) { 
    return false; 
    } 

ist in dem es heißt, dass der Benutzer nicht die erforderliche Rolle @RolesAllowed („user“) sogar die Ausführung der kommentierten Methode eingeben.

Sie sollten eine anspruchsvollere isUserInRole Methode implementieren, die überprüft, wheter ein Benutzer eine bestimmte Rolle hat oder :) nicht

Grüße

13

Sie müssen eine Priorität für Ihre Authentifizierungsfilter definieren, da sonst die RolesAllowedRequestFilter in RolesAllowedDynamicFeature wird vor Ihrer AuthenticationFilter ausgeführt. Wenn Sie sich den Quellcode ansehen, hat der RolesAllowedRequestFilter die Anmerkung @Priority(Priorities.AUTHORIZATION). Wenn Sie also Ihrem Authentifizierungsfilter @Priority(Priorities.AUTHENTICATION) zuweisen, wird er vor dem RolesAllowedRequestFilter ausgeführt. Wie folgt aus:

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

könnten Sie auch tatsächlich benötigen, um die AuthenticationFilter mit register(AuthenticationFilter.class) zu registrieren, je nachdem, ob der Server-Scans für Anmerkungen oder nicht.

+1

Danke, du hast meinen Tag gerettet. Ich habe die Priorität gesetzt, indem ich das Register (AuthenticationFilter.class, Priorities.AUTHENTICATION) benutzt habe, aber anscheinend wurde das völlig ignoriert. Mit der Annotation wurde es behoben. – emas

+0

Du hast meinen Tag gerettet !!! – Manish