Deseo implementar autorizaciones personalizadas en mis servicios REST utilizando Jersey. Esta autorización personalizada inspecciona las anotaciones sobre los métodos, así como los parámetros reales que recibe un método .Obteniendo valores de parámetros reales en Jersey ResourceFilterFactory
Mi método JAX-RS anotada parece:
@GET
@Path("customers")
@Requires(Role.CustomerManager)
public Customer getCustomer(@ParseFromQueryString @CheckPermission final Customer customer) {
// ...
}
El @ParseFromQueryString
es una anotación que indica Jersey (a través de un proveedor inyectable) Resolver referencia a un Customer
de una cadena de consulta. El código para que se parece a:
public class QueryStringCustomerInjectable implements Injectable<Customer> {
public Customer getValue() {
final Customer customer = new Customer();
// ... a UriInfo was injected using the @Context annotation
// ... extract parameters from QueryString and use setters
return customer;
}
}
La anotación @CheckPermission
indica mi autorizador a medida que los permisos se van a comprobar en un cliente. Algunos usuarios tienen acceso a información sobre algunos clientes. Del mismo modo, la anotación @Requires
toma un rol que el invocador debería tener. Estos no son roles de seguridad de Java (Strings), sino que son valores enum.
Usando Jersey ResourceDebuggingFilter
como punto de partida, he podido llegar al punto de saber qué método se invocará. Sin embargo, todavía no he descubierto cómo determinar qué parámetros se utilizarán realmente para invocar el método.
En la parte superior de mi cabeza, no puedo pensar en dos arounds de trabajo:
- interceptor de un método que utiliza Guice + Jersey.
- Codifique esta lógica en el
QueryStringCustomerInjectable
, pero esto parece un poco descuidado. Sería una clase haciendo demasiado.
Sin embargo, me gustaría realmente gustaría hacer esto utilizando solamente Jersey/JAX-RS. ¡Siento que estoy tan cerca!
Ideas? ¿Punteros?
Gracias!
Todavía no he encontrado una manera sin guin de hacer esto ... Así que está usando guice, o use cxf, que proporciona interceptores y una manera de proporcionar sus propios invocadores. – chahuistle
¿Ha analizado el AOP o simplemente utilizando un filtro de servlet para la solución 1? – hisdrewness
¿Ha intentado utilizar un 'ContainerRequestFilter' e inyectar al cliente en él? No estoy seguro de si '@ BeanParam's está restringido a los recursos o si también pueden ser inyectados en filtros, pero supongo que siempre y cuando el filtro no sea preMatch, debería funcionar. –