12
votes

Comment récupérer des ressources correspondantes d'une demande dans un conteneurRequestFilter

Je travaille sur un service Web utilisant JAX-RS / JERSEY.

J'ai configuré un conteneurreQuestFilter dont le but est d'authentifier l'utilisateur. Il suffit de protéger certains des chemins avec authentification, le reste peut être disponible pour tout le monde.

Je veux récupérer des correspondancesResources / assortiesRésultats via ExtendendeuriInfo dans mon conteneurRequestFilter afin que je puisse vérifier si le chemin doit être protégé ou non. Existe-t-il un moyen de créer un filtre invoqué après que ExtenduriInfo est peuplé, mais avant que la classe de ressources correspondante et la méthode soit invoquée?


4 commentaires

On dirait que vous réinventant un peu de java ee! Si vous n'avez pas de EJB assis derrière votre service Web, envisagez d'en ajouter un. Vous serez capable d'annoter des rôles comme vous voulez.


Merci pour la suggestion Richard. Je n'ai pas encore regardé aux rôles tout cela encore, mais j'avais les rôles d'impression travaillés uniquement avec une méthode d'authentification configurée. J'ai une méthode Login , et après que l'utilisateur se connecte, il / elle communique avec le Webservice à l'aide d'une paire d'utilisateurs AccessToken +.


Certes, mon expérience avec authentification via des services Web est faible. Je sais que via l'interface de servlet, une API est disponible pour enregistrer un utilisateur de côté de la méthode d'autorisation. En bref, des servlets peuvent "coder leur propre" méthode d'authentification. J'avais toujours supposé qu'il y avait aussi des services Web.


Étant donné que vous utilisez un filtre, ce mécanisme doit être disponible pour vous: voir docs.oracle.com/javaee/6/afi/javax/servlet/http/... , java.lang.string)


3 Réponses :


3
votes

J'ai réussi à le comprendre.

L'approche que j'ai trouvée au travail est d'abandonner cela dans le conteneurrequestfilter et créer un ressourcefilterfactory . Dans le ressourceFilterFactory i peut utiliser xxx

pour déterminer si mon annotation personnalisée est présente. Si mon annotation est présente, je peux alors retourner une liste contenant mon authentificationContainerReQuestFilter .

Un autre conseil pour que toute personne lisant cette réponse est que l'injection dans le conteneurRequestFilter ne fonctionnera pas lors de l'utilisation de la < em> approche ressourceFilterFactory. Ce que j'ai fait était de faire une injection dans la ressourcefilterfactory , puis transmettez les objets injectés au ContainerQuestFilter via son constructeur.


0 commentaires

5
votes

a trouvé un moyen de le faire avec conteneurreQuestFilter : xxx


0 commentaires

10
votes

Voici une réponse plus générale (par exemple, si vous utilisez une autre implémentation JAX-RS comme CXF):

Ajoutez simplement les éléments suivants dans votre classe de filtres en tant que variable d'instance:

@Context

Info ResourceInfo;

"javax.ws.rs.container.resourceinfo est un nouveau contexte Jax-rs qui peut être injecté dans des filtres et des intercepteurs et vérifié quelle ressource La classe et la méthode sont sur le point d'être invoquées. "

(Source: HTTPS: // cwiki.apache.org/confluence/display/cxf20doc/jax-rs+basics#jax-rsbasics-resourceInfo )


0 commentaires