2013-06-12 14 views
5

Sto provando ad autenticare gli utenti con un filtro JAX-RS che sembra funzionare finora. Questo è il filtro dove sto stabilendo un nuovo SecurityContext:Autorizzazione con RolesAllowedDynamicFeature e 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 
    } 
} 

Il metodo di risorse appare così:

@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"); 
    } 

Il RolesAllowedDynamicFeature è registrato in questo modo:

.register(RolesAllowedDynamicFeature.class) 

posso vedere gli output previsti sulla console. Ma se rimetto il commento @RolesAllowed("user"), ottengo un errore Forbidden e il metodo isUserInRole del mio SecurityContext non viene mai chiamato. A seguito di API doc RolesAllowedDynamicFeature dovrebbe chiamare questo metodo.

Come posso utilizzare RolesAllowedDynamicFeature?

risposta

1

Credo che sia a causa della

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

che affermi, che l'utente non ha il ruolo richiesto @RolesAllowed ("utente") per inserire anche l'esecuzione del metodo annotato.

Si dovrebbe implementare un metodo IsUserInRole più sofisticato che controlla, anche depurato un utente ha un ruolo specifico o no :)

riguarda

13

È necessario definire una priorità per il filtro di autenticazione, altrimenti il ​​RolesAllowedRequestFilter in RolesAllowedDynamicFeature verrà eseguito prima del AuthenticationFilter. Se si guarda il codice sorgente, l'RolesAllowedRequestFilter ha l'annotazione @Priority(Priorities.AUTHORIZATION), quindi se si assegna @Priority(Priorities.AUTHENTICATION) al proprio filtro di autenticazione verrà eseguito prima dello RolesAllowedRequestFilter. Come questo:

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

Potrebbe anche essere necessario per registrare in realtà il AuthenticationFilter utilizzando register(AuthenticationFilter.class), a seconda se le scansioni del server per le annotazioni o meno.

+1

Grazie, mi hai salvato la giornata. Stavo impostando la priorità usando il registro (AuthenticationFilter.class, Priorities.AUTHENTICATION) ma a quanto pare in qualche modo è stato completamente ignorato. L'uso dell'annotazione lo ha risolto. – emas

+0

Hai salvato anche la mia giornata !!! – Manish