2010-05-25 12 views
39

Estoy desarrollando una aplicación REST, que utiliza el marco Jersey. Me gustaría saber cómo puedo controlar la autenticación de usuario. He buscado en muchos lugares, y el artículo más cercano que he encontrado es el siguiente: http://weblogs.java.net/blog/2008/03/07/authentication-jersey.Autenticación de usuario en un servicio REST de Jersey

Sin embargo, este artículo solo se puede utilizar con un servidor GlassFish y una base de datos adjunta. ¿Hay alguna forma de que pueda implementar una interfaz en Jersey y usarla como filtro antes de llegar al recurso REST solicitado?

Quiero utilizar la autenticación básica en este momento, pero debe ser lo suficientemente flexible como para poder cambiar eso en otro momento.

Respuesta

32

Estoy utilizando con éxito la seguridad de primavera para asegurar mi API basada en Jersey. Tiene esquemas de autenticación conectables que le permiten cambiar de autenticación básica a otra cosa más adelante. No estoy usando Spring en general, solo las cosas de seguridad.

Aquí es la parte relevante de mi web.xml

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/security-applicationContext.xml, 
     /WEB-INF/applicationContext.xml 
    </param-value> 
</context-param> 

<!-- Enables Spring Security --> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class> 
     org.springframework.web.filter.DelegatingFilterProxy 
    </filter-class> 
    <init-param> 
     <param-name>targetBeanName</param-name> 
     <param-value>springSecurityFilterChain</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 

</filter-mapping> 

se puede dejar vacío applicationContext.xml (<granos> </frijoles >). Se puede encontrar un ejemplo de security-applicationContext.xml here

+0

de fragmentos que no es más compartida existe para la seguridad applicationContext.xml – Ishan

+0

Hay un ejemplo de esta respuesta aquí: http: // stackoverflow.com/a/20882134/320791 – MauroPorrasP

+0

He reemplazado el fragmento de datos muertos por un elemento principal que contiene un ejemplo security-applicationContext.xml –

8

Estoy trabajando en algo similar a esto. En mi implementación, tenemos Apache httpd front-ended para manejar la autenticación HTTP básica y simplemente reenvía todas las solicitudes con información de encabezado que contiene el usuario y los roles.

A partir de eso, estoy trabajando en el análisis de estas piezas utilizando un servlet filter para envolver el HttpServletRequest usando una publicación que encontré en CodeRanch. Esto me permite usar las anotaciones javax.annotation.security como @RolesAllowed en cada recurso que deseo filtrar. Para conseguir todas estas piezas de trabajo, sin embargo, he tenido que añadir lo siguiente a mi servlet en el web.xml:

<servlet> 
    <!-- some other settings and such 
    ... --> 
    <init-param> 
    <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name> 
    <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value> 
    </init-param> 
    ... 
</servlet> 

Usted puede encontrar que la respuesta de Eric Warriner en un reciente artículo de su interés: Jersey, Tomcat and Security Annotations

+0

una vez que implementa un envoltorio y filtro (s) personalizados, ¿cómo los conecta para que se llamen? en las solicitudes de recursos? – Blaskovicz

+0

¿Cómo se las arregló para hacer esto? Estoy buscando una forma de hacer esto, ¿tal vez puedes averiguar algo del código que usaste? – Joelmob

3

Claro, puedes usar un filtro de servlet tradicional para esto.

Agregue el filtro a su web.xml, verifique los encabezados de autenticación que esté usando (Básico o Resumen), realice su lógica de autenticación basada en esos valores y almacene el resultado en un atributo de sesión. En su recurso de Jersey (posiblemente ctor), extraiga el resultado de autenticación del atributo de sesión y continúe el procesamiento o no según si este es el resultado que necesita.

Su ctor recursos Jersey, probablemente se vería así:

protected AbstractResource(@Context ServletContext servletContext, 
    @Context HttpServletRequest httpServletRequest) { 

    ... 

    HttpSession session = httpServletRequest.getSession(); 
    // get whatever you put in the session in the auth filter here and compare 
} 
2

usted puede hacerlo de dos maneras, ya sea que escribir un filtro de servlet simple o hay que implementar un ResourceFilterFactory y manejar la autenticación en ContainerRequestFilter. El código detallado se encuentra en el enlace http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html. Me gusta el enfoque del filtro de servlet personalmente ya que proporciona un control completo del ciclo de vida. Sin embargo, si necesita cosas más específicas como acceder a QueryParams o PathParams, entonces ResourceFilterFactory es el camino a seguir.

Cuestiones relacionadas