2010-02-18 20 views
10

Ho bisogno di proteggere una semplice API RESTful di jersey in un contenitore Tomcat 6.0.24. Mi piacerebbe mantenere l'autenticazione con l'autenticazione di base usando il file tomcat-users.xml per definire utenti e ruoli (questo è per ora, come ho detto è piccolo).Annotazioni Jersey, Tomcat e Sicurezza

Ora, per l'autorizzazione mi piacerebbe essere in grado di utilizzare le annotazioni JSR 250 come @RolesAllowed, @PermitAll, @DenyAll, ecc

non posso per la vita di me capire come collegare tutto questo insieme .

Non voglio davvero seguire il percorso di Spring Security, poiché al momento ho bisogno di qualcosa di molto semplice.

Qualcuno può indicarmi la giusta direzione?

+0

Poiché hai codificato questa domanda con 'spring' e' spring-security' ma hai invece affermato che non vuoi usarlo, stai effettivamente usando la molla? Se no, lasciali via. – BalusC

+0

http://stackoverflow.com/questions/16433315/can-i-use-rolesallowed-on-restful-resources-implemented-on-apache-cxf – JayTee

risposta

1

Si può iniziare con l'uso di un filtro che copre inizialmente la gestione di autenticazione e privilegi. con l'implemeting di ResourceFilter e ContainerRequestFilter, è possibile ottenere httpRequest, quindi le sessioni reindirizzano l'applicazione/le richieste ai metodi correlati.

Per la gestione dei privilegi è possibile implementare il filtro SecurityContext. devi prima controllare isUserInRole per far entrare la richiesta nel metodo.

Ecco la sasmple per l'attuazione SecurityContext:

public class SecurityContextImpl implements SecurityContext { 

    private final SessionUser user; 

    public SecurityContextImpl(SessionUser user) { 
     this.user = user; 
    } 

    public Principal getUserPrincipal() { 
     return user; 
    } 

    public boolean isUserInRole(String role) { 

     if(user == null) { 
      throw new AuthenticationException(); 
     } 
     if(ObjectUtil.isNull(user.getPrivileges())){ 
      throw new AuthenticationException(); 
     } 
     if(!user.getPrivileges().contains(role)) { 
      throw new InvalidAuthorizationHeaderException(); 
     } 
     return user.getPrivileges().contains(role); 
    } 

    public boolean isSecure() { 
     return false; 
    } 

    public String getAuthenticationScheme() { 
     return SecurityContext.BASIC_AUTH; 
    } 
} 

Ecco l'attuazione secirtyCotnextFilter base:

public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter { 

    private static final Logger LOG = LoggerFactory.getLogger(SecurityContextFilter.class); 

    protected static final String HEADER_AUTHORIZATION = "Authorization"; 

    protected static final String HEADER_DATE = "x-java-rest-date"; 

    protected static final String HEADER_NONCE = "nonce"; 


    private HttpServletRequest httpRequest; 




    public SecurityContextFilter() { 


    } 


    public ContainerRequest filter(ContainerRequest request) { 

     SessionUser sessionUser = (SessionUser) httpRequest 
       .getSession() 
       .getAttribute("sessionUser"); 

     request.setSecurityContext(new SecurityContextImpl(sessionUser)); 

     return request; 
    } 


    public ContainerRequestFilter getRequestFilter() { 
     return this; 
    } 

    public ContainerResponseFilter getResponseFilter() { 
     return null; 
    } 

    public HttpServletRequest getHttpRequest() { 
     return httpRequest; 
    } 

    public void setHttpRequest(HttpServletRequest httpRequest) { 
     this.httpRequest = httpRequest; 
    } 


} 

Non fotget di mettere il filtro come init-param all'interno del web.xml ,

Quindi è possibile gestire la richiesta con la propria logica ruolo-privilegio-autenticazione.

Problemi correlati