2010-05-25 4 views
39

Sto sviluppando un'applicazione REST, che utilizza il framework Jersey. Mi piacerebbe sapere come posso controllare l'autenticazione dell'utente. Ho cercato in molti posti e l'articolo più vicino che ho trovato è questo: http://weblogs.java.net/blog/2008/03/07/authentication-jersey.Autenticazione utente su un servizio REST Jersey

Tuttavia, questo articolo può essere utilizzato solo con un server GlassFish e un database collegato. Esiste comunque la possibilità di implementare un'interfaccia in Jersey e usarla come filtro prima di raggiungere la risorsa REST richiesta?

Desidero utilizzare l'autenticazione di base in questo momento, ma dovrebbe essere abbastanza flessibile in modo che possa essere modificato in un secondo momento.

risposta

32

Sto utilizzando con successo la sicurezza di primavera per proteggere la mia API basata su Jersey. Ha schemi di autenticazione collegabili che consentono di passare da Autenticazione di base a qualcos'altro in un secondo momento. Non sto usando Spring in generale, solo le cose di sicurezza.

Ecco la parte rilevante dal mio 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> 

Puoi lasciare applicationContext.xml vuota (<fagioli> </fagioli >). Un esempio di security-applicationContext.xml può essere trovato here

+0

frammento si è condivisa non esiste più per la sicurezza-applicationContext.xml – Ishan

+0

V'è un esempio di questa risposta qui: http: // stackoverflow.com/a/20882134/320791 – MauroPorrasP

+0

Ho sostituito il snippet dead con un gist contenente un esempio security-applicationContext.xml –

8

Sto lavorando a qualcosa di simile a questo. Nella mia implementazione, abbiamo Apache httpd front-ended per gestire l'autenticazione HTTP Basic e inoltra semplicemente tutte le richieste con alcune informazioni di intestazione contenenti l'utente e i ruoli.

Da questo, sto lavorando per analizzare questi pezzi utilizzando un servlet filter per avvolgere il HttpServletRequest utilizzando un post che ho trovato su CodeRanch. Questo mi consente di utilizzare le annotazioni javax.annotation.security come @RolesAllowed su ogni risorsa che voglio filtrare. Per ottenere tutti questi pezzi di lavoro, però, ho dovuto aggiungere il seguente al mio servlet nella 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> 

Si potrebbe scoprire che la risposta di Eric Warriner su un recente post di interesse: Jersey, Tomcat and Security Annotations

+0

una volta implementato un wrapper e filtri personalizzati, come li leghi in modo che vengano chiamati sulle richieste di risorse? – Blaskovicz

+0

Come sei riuscito a fare questo? Sto cercando un modo per farlo, forse puoi elencare il codice che hai usato? – Joelmob

3

Certo, puoi usare un filtro servlet tradizionale per questo.

Aggiungere il filtro al file web.xml, verificare le intestazioni di autenticazione che si stanno utilizzando (di base o di digest), eseguire la logica di autenticazione in base a tali valori e archiviare il risultato in un attributo di sessione. Nella risorsa Jersey (probabilmente il creatore), estrarre il risultato auth dall'attributo della sessione e continuare l'elaborazione o meno a seconda che questo sia il risultato richiesto.

tuo ctor risorsa Jersey sarebbe probabilmente simile a questa:

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

lo si può fare in due modi, o si scrivere un semplice filtro servlet o si deve implementare un ResourceFilterFactory e gestire l'autenticazione in ContainerRequestFilter. Il codice dettagliato si trova nel collegamento http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html. Mi piace l'approccio del filtro servlet in quanto fornisce un controllo completo del ciclo di vita. Tuttavia, se hai bisogno di cose più specifiche come accedere a QueryParams o PathParams, allora ResourceFilterFactory è la strada da percorrere.