2012-02-03 1 views
6

Ho applicazioni web e due domini per esso - example.com e example.ruCome si può fare un singolo accesso con sicurezza di primavera su due domini?

example.com - per internazionali

example.ru - per paese

mio web app utilizzando la protezione di primavera per gli utenti autorizzati, ma se l'accesso utente tramite example.com su example.ru non viene registrato.

Come si può fare se l'utente effettua l'accesso tramite example.com o example.ru che verrà registrato su entrambi i domini?

PS: A proposito il mio web autorizzazione all'uso applicazione tramite OpenID e OAuth

+0

Il meccanismo che si sta cercando si chiama single sign on. –

+0

Un problema che devi risolvere (io penso di implementarlo da solo) è che l'ID di sessione è la maggior parte del tempo memorizzato in un cookie. Ma il browser assegna i cookie a un dominio, quindi dovrai gestire due diversi sessionId – Ralph

+0

Il modo corretto per farlo è con SSO come ha detto Kurt. Tuttavia, poiché stai utilizzando OpenID e OAuth, puoi anche simulare il single sign on utilizzando un client HTTP per aprire l'altro sito Web e quindi restituire il cookie all'utente. Ho dovuto farlo in ambienti in cui abbiamo mixato le vecchie versioni di Acegi e le nuove applicazioni Spring Security. Non è bello, né la cosa giusta da fare, ma è veloce e porta a termine il lavoro. – Joe

risposta

2

Come accennato è necessario un unico segno sulla soluzione, Cloudseal fornisce un'estensione di sicurezza a molla, che comprende uno spazio dei nomi molla in modo avete solo bisogno di fare qualcosa di simile:

<security:http entry-point-ref="cloudseal"> 
    <security:intercept-url pattern="/protected/user.do" access="IS_AUTHENTICATED_FULLY" /> 
    <security:intercept-url pattern="/protected/admin.do" access="ROLE_ADMIN" /> 
</security:http> 

<cloudseal:sso endpoint="http://cloudseal.com" entry-point-id="cloudseal" app-id="quickstart"> 
    <cloudseal:keystore location="WEB-INF/keystore.jks" password="nalle123"> 
     <cloudseal:key name="apollo" password="nalle123" /> 
    </cloudseal:keystore> 
    <cloudseal:metadata location="WEB-INF/idp.xml" /> 
</cloudseal:sso> 

Vedi www.cloudseal.com/platform/spring-security-single-sign-on

0

E 'impossibile, senza modificare il codice di sicurezza a molla. L'ho fatto qualche volta fa ma è molto difficile da manutenere

Cas è il modo più semplice per questo nel mondo java. http://www.jasig.org/cas

1

Mentre questo tipo di funzionalità non è affatto banale da raggiungere, è infatti possibile senza modificare Spring.

Il codice effettivo è troppo grande per la pubblicazione, quindi cercherò di delineare il principio di base e lasciare la codifica a voi.

  1. Allunga la primavera del SavedRequestAwareAuthenticationSuccessHandler e implementare funzionalità per serializzare e scrivere l'oggetto a un cookie di sessione Authentication con una portata globale. Vedere la documentazione per l'attributo nel tag <sec:http> di Spring per ulteriori informazioni su come collegare . (Nota: se il problema si verificava tra più app Web su stesso dominio, si potrebbe ovviamente limitare l'ambito cookie al dominio corrente ).
  2. In tutte le tue applicazioni web, aggiungere un web.xml<filter> definizione nome springSecurityFilterChain e la classe org.springframework.web.filter.DelegatingFilterProxy e <filter-mapping> per il filtro con un modello URL di /* Non è necessario creare il fagiolo reale, Primavera di sicurezza fornisce un implementazione predefinita per te.
  3. In tutte le tue applicazioni web, aggiungi al web.xml un <filter> definizione nome singleSignonAuthenticationFilterChain con classe org.springframework.web.filter.DelegatingFilterProxy e corrispondente <filter-mapping> per il filtro con un modello URL di /*
  4. Ora si aggiunge un nuovo bean chiamato singleSignonAuthenticationFilterChain, che dovrebbe indicare una classe che è implements Filter.Nel metodo doFilter(), verificare se esiste un attributo di sessione denominato SPRING_SECURITY_CONTEXT. Se lo è , significa che è già stato effettuato il login. In alternativa, prendi il token serializzato Authentication, deserializza e usa SecurityContextHolder.getContext().setAuthentication(authentication) per autenticare l'utente con Spring. Ricorda inoltre di session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext()) oppure l'autenticazione occuperà ogni volta, il che non è necessario.

Una svolta a (4) è che se si scopre che non esiste un attributo chiamato SPRING_SECURITY_CONTEXT, è possibile che l'utente si sia appena disconnesso dall'applicazione Web corrente. In questo caso deve essere disconnesso a livello globale, quindi in questo caso si desidera rimuovere il cookie contenente il token di autenticazione serializzato.

È un po 'complesso scrivere in un riepilogo di una pagina, ma spero che tu abbia un'idea generale. Attualmente lo abbiamo implementato in un'applicazione complessa composta da più applicazioni web e funziona bene.

+0

Puoi elaborare, in particolare i passaggi 1 e 4? Ho provato questo ma non posso ottenere la guerra 2 per vedere il cookie di war 1 – blong824