2009-06-14 13 views
6

Attualmente sto usando l'autenticazione basata su FORM in glassfish v2.1 per registrare gli utenti e funziona correttamente. Voglio passare a ProgrammaticLogin e voglio essere in grado di ottenere l'URL inizialmente richiesto (ad esempio prima di reindirizzare alla pagina di accesso) e utilizzarlo nel mio codice di accesso programmatico in modo che l'utente venga reindirizzato alla pagina richiesta dopo l'autenticazione.Come sovrascrivere j_security_check in glassfish?

Ho visto il codice sorgente per j_security_check - nel mio caso che è FormAuthenticator (catalina codebase) e si salva la richiesta iniziale in un oggetto SavedRequest nella sessione, ma la sessione è una StandardSession piuttosto che HttpSession quindi non c'è modo diretto per accedervi.

Oppure devo cambiare il meccanismo di autenticazione da FORM a qualcos'altro?

Grazie!

risposta

8

Ok, ho trovato la risposta. Quindi eccolo:

Fondamentalmente quello che stavo cercando di ottenere era implementare un meccanismo di autenticazione basato su openid in glassfish. Un modo per farlo è usare ProgrammaticLogin ma questo ha alcuni svantaggi: non è un modo semplice per reindirizzare l'URL richiesto e l'autenticazione programmatica significa più lavoro per il programmatore. Quindi, dopo aver letto in giro ho trovato il modo migliore per raggiungere il mio obiettivo - Server Authentication Modules o SAM. Questo fa parte di un processo standard descritto in JSR-196 e fornisce un modo per creare moduli di autenticazione pluggable per glassfish (cioè diversi dallo standard FORM, BASIC ecc.). Questo metodo consente di collegare nuovi moduli di autenticazione nel contenitore servlet mantenendo il modello di sicurezza dichiarativo.

Quindi tutto ciò che devo fare è scrivere il mio SAM personalizzato. Ecco un rapido how-to:

  1. implementare l'interfaccia ServerAuthModule che bolle in gran parte verso il basso per il seguente metodo:

    AuthStatus validateRequest(MessageInfo messageInfo, security.auth.Subject clientSubject, security.auth.Subject serviceSubject) throws AuthException

  2. pacchetto SAM in un barattolo, e posizionare il vaso in directory di glassfish lib.

  3. Configurare il SAM per l'uso con l'applicazione. Questa operazione viene eseguita in 2 passaggi:

    • Definire il SAM come un provider di sicurezza dei messaggi in domain.xml.
    • Associare il SAM per l'uso con l'applicazione. Puoi farlo definendo l'attributo httpservlet-security-provider nel sun-web-app.xml della tua app. Imposta il valore dell'attributo sul nome che hai assegnato al tuo SAM al punto 1.

Per maggiori informazioni leggi this great tutorial by Ron Monzillo.

UPDATE: c'è una soluzione più semplice e più elegante a questo problema chiamato AuthenticRoast. Questa è una libreria Java scritta da Aike Sommer che consente di scrivere i propri autenticatori collegabili.

1

Se l'autenticazione del modulo non funziona, si consiglia di passare all'utilizzo di un ServletFilter per l'autenticazione. Basta sbarazzarsi dell'autenticazione basata su FORM e aggiungere una mappatura al filtro per le pagine che si desidera proteggere.

+0

grazie! Ho guardato SecurityFilter ma poi ho trovato un modo migliore per raggiungere il mio obiettivo attenendosi al modello di sicurezza dichiarativa del glassfish. – albogdano