2010-02-18 22 views
10

Necesito asegurar una simple API RESTful de Jersey en un contenedor Tomcat 6.0.24. Me gustaría mantener la autenticación con Autenticación básica usando el archivo tomcat-users.xml para definir los usuarios y roles (esto es por ahora, como dije, es pequeño).Jersey, Tomcat y anotaciones de seguridad

Ahora, para la autorización que me gustaría ser capaz de utilizar las anotaciones JSR 250 como @RolesAllowed, @PermitAll, @DenyAll, etc.

yo no puedo por la vida de a averiguar cómo conectar todo esto juntos .

Realmente no quiero ir a la ruta Spring Security, ya que necesito algo muy simple en este momento.

¿Puede alguien señalarme en la dirección correcta?

+0

Dado que etiquetó esta pregunta con 'spring' y' spring-security' pero en cambio indicó que no desea usarla, ¿está realmente usando spring? Si no, solo déjalos fuera. – BalusC

+0

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

Respuesta

1

Puede comenzar utilizando un filtro que cubre la autenticación y la administración de privilegios al principio. con la implementación de ResourceFilter y ContainerRequestFilter, tu capacidad para obtener httpRequest, sesiones luego redirige tu solicitud/solicitudes a los métodos relacionados.

Para la gestión de privilegios puede implementar el filtro SecurityContext. tienes que verificar isUserInRole al principio para permitir que la solicitud entre al método.

Aquí es el sasmple para la implementación 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; 
    } 
} 

Aquí está la implementación básica secirtyCotnextFilter:

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; 
    } 


} 

No fotget para poner el filtro como init-param dentro del web.xml ,

Luego puede manejar la solicitud con su lógica de privilegio-autenticación de rol.

Cuestiones relacionadas