2012-01-10 23 views
16

Speravo che il passaggio a create-session="stateless" sarebbe stato la fine di esso per ottenere la sicurezza primaverile stateless nella mia webapp, ma non è così.uso stateless create-session

Con tale modifica, la sicurezza di primavera sembra non funzionare, poiché (la mia ipotesi) la sicurezza di primavera non memorizza nulla nella sessione e non può eseguire l'autenticazione per le richieste Web protette.

Come si utilizza questa funzione stateless stateless?

Non riesco a trovare esempi pertinenti ancora su come ottenere la sicurezza di molle senza stato per una webapp stateless.

Grazie!

risposta

18

Ho una webapp basata su Spring che ha una protezione completamente stateless e l'unico modo per farlo funzionare è disabilitare completamente la creazione della sessione (con create-session="never"). Ciò impone la re-autenticazione con ogni richiesta, quindi vorrete configurare anche la webapp per utilizzare l'Auth di base o Digest di HTTP (oltre HTTPS, ovviamente) in quanto non richiedono una negoziazione particolarmente complessa (al contrario, forma l'accesso basato su base e OAuth sia richiedono una sessione perché hanno un processo molto più complicato per stabilire il contesto di autenticazione). Ciò significa che dovrai inserire un elemento come <security:http-basic /> all'interno dell'elemento <security:http>.

(Il vantaggio di farlo in questo modo è che abilita librerie client estremamente semplici in quanto non devono fare cookie/gestione delle sessioni.Il costo è un overhead di elaborazione - l'istituzione di quale set di ruoli l'utente è partecipando come sarà necessario ricalcolare su ogni richiesta e alcune limitazioni su quali meccanismi di autenticazione è possibile utilizzare)

+1

Grazie per la risposta. Ho provato di base e digerire prima, ma mi sono sentito molto a disagio con l'impossibilità di "disconnettersi" dalla mia webapp e inserire una nuova credenziale senza riavviare il browser. Inoltre, pensi che essere in grado di scalare orizzontalmente facilmente per webapp/webserve stateless giustifica il costo delle prestazioni? – bertie

+1

@Albert: È difficile dire molto sui costi senza misurarli per davvero. :-) Tuttavia, se si desidera eseguire il logout, si _need_ per mantenere lo stato di un client e ciò significa eseguire la gestione dei cookie; il cliente deve fornire un qualche tipo di indicazione di quale sessione stia parlando dal momento che HTTP stesso è stateless, e questo è un requisito difficile. –

+0

Quello che vorrei consigliare è non preoccuparsi troppo del ridimensionamento per iniziare; convincere gli utenti/clienti è molto più di un problema. Durante il ridimensionamento, la vera chiave è se è possibile replicare un servizio o se si dispone di un'istanza singleton; di regola, i server Web sono di solito relativamente facili da replicare, ma i database no. –

24

La risposta di Donal è sostanzialmente corretta, e per un browser probabilmente non si desidera utilizzare un'app stateless.

Per riferimento, create-session="stateless" è un'opzione migliore se si dispone di un'app stateless come un client RESTful. Questa opzione è stata introdotta in Spring Security 3.1. Eviterà di aggiungere parti dell'infrastruttura di Spring Security che fanno uso della sessione (ad esempio HttpSessionSecurityContextRepository, SessionManagementFilter, RequestCacheFilter), in modo da ottenere una configurazione più snella.

Con create-session="never", Spring Security non creerà mai una sessione, ma ne userà una se l'app lo fa. In pratica, molti utenti non sono nemmeno consapevoli del fatto che stanno creando sessioni, quindi se davvero non vuoi una sessione, mai, allora l'opzione migliore è quella stateless.

+0

+1: non conoscevo questa opzione, ma non ho ancora approfondito troppo la 3.1. –

+1

+1 Lasciatemi dire che questa risposta mi ha appena salvato un mondo di dolore. Tomcat continuava a negare l'accesso agli utenti perché così tante sessioni venivano create dal mio cliente RESTful. Grazie! – thatidiotguy

Problemi correlati