web-dev-qa-db-fra.com

Authentification utilisateur sur un Jersey REST

Je suis en train de développer une application REST, qui utilise le framework Jersey. Je voudrais savoir comment contrôler l'authentification des utilisateurs. J'ai cherché dans de nombreux endroits, et l'article le plus proche que j'ai trouvé est celui-ci : http://weblogs.Java.net/blog/2008/03/07/authentication-jersey .

Cependant, cet article ne peut être utilisé qu'avec un serveur GlassFish et une base de données attachée. Existe-t-il de toute façon que je peux implémenter une interface dans Jersey et l'utiliser comme filtre avant d'atteindre la ressource REST) demandée?

Je veux utiliser l'authentification de base en ce moment, mais elle devrait être suffisamment flexible pour que je puisse la modifier ultérieurement.

39
Stefan

J'utilise avec succès la sécurité Spring pour sécuriser mon API basée sur Jersey. Il a des schémas d'authentification enfichables vous permettant de passer de l'authentification de base à quelque chose d'autre plus tard. Je n'utilise pas Spring en général, juste les trucs de sécurité.

Voici la partie pertinente de mon 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>

Vous pouvez laisser applicationContext.xml vide (<beans> </beans>). Un exemple de security-applicationContext.xml peut être trouvé ici

32
Magnus Eklund

Je travaille sur quelque chose de similaire à cela. Dans mon implémentation, nous avons Apache httpd frontal pour gérer l'authentification HTTP de base et il transfère simplement toutes les demandes avec des informations d'en-tête contenant l'utilisateur et les rôles.

À partir de cela, je travaille sur l'analyse de ces éléments à l'aide d'un filtre de servlet pour envelopper le HttpServletRequest à l'aide d'un message que j'ai trouvé sur CodeRanch . Cela me permet d'utiliser le javax.annotation.security annotations comme @RolesAllowed sur chaque ressource que je souhaite filtrer. Pour que toutes ces pièces fonctionnent, cependant, j'ai dû ajouter ce qui suit à ma servlet dans le 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>

Vous trouverez peut-être la réponse d'Eric Warriner sur un récent article intéressant: Jersey, Tomcat et annotations de sécurité

8
Nick Klauer

Jetez un œil ici, je suis en train de l'essayer, mais cela semble prometteur:

http://anismiles.wordpress.com/2012/03/02/02/securing-versioning-and-auditing-rest-jax-rs-jersey-apis/

Cet exemple est beaucoup plus simple que d'essayer d'implémenter JASPI/JASPIC et donne une meilleure granularité aux méthodes individuelles (@RolesAllowed, @PermitAll, @DenyAll, etc ...).

(Je sais que c'est un vieux fil, mais juste en ajoutant des informations potentiellement utiles)

4
millebi

Bien sûr, vous pouvez utiliser un filtre de servlet traditionnel pour cela.

Ajoutez le filtre à votre web.xml, recherchez les en-têtes d'authentification que vous utilisez (de base ou Digest), effectuez votre logique d'authentification en fonction de ces valeurs et stockez le résultat dans un attribut de session. Dans votre ressource Jersey (ctor probablement), extrayez le résultat d'authentification de l'attribut de session et continuez le traitement ou non selon que c'est le résultat dont vous avez besoin.

Votre ctor de ressources Jersey ressemblerait probablement à ceci:

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
}
3
ae6rt

Vous pouvez le faire de deux manières, soit vous écrivez un filtre de servlet simple, soit vous devez implémenter un ResourceFilterFactory et gérer l'auth dans ContainerRequestFilter. Le code détaillé se trouve dans le lien http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html . J'aime personnellement l'approche du filtre de servlet car elle donne un contrôle complet du cycle de vie. Cependant, si vous avez besoin de choses plus spécifiques comme accéder à QueryParams ou PathParams, ResourceFilterFactory est le chemin à parcourir.

2
kalpesh