Accesso JSF / Java EE senza richiedere una risorsa protetta


In un'applicazione Web JSF2 / Java EE 6 che utilizza la sicurezza gestita dal contenitore, l'autenticazione basata su moduli (j_security_check) richiede la richiesta di una pagina protetta, dopodiché il contenitore gestisce il processo di accesso per l'utente, reindirizzando il browser alla pagina richiesta una volta autenticato.

Esistono molti scenari comuni in cui non è così che si desidera che l'applicazione si comporti. Ad esempio, si potrebbe desiderare di avere una versione di sola lettura e una versione aggiornabile della stessa pagina. Potresti inserire un pulsante "accedi ora per modificare" su quella pagina se l'utente non ha effettuato l'accesso e rendere i campi modificabili se l'utente ha effettuato l'accesso. Ma è la stessa pagina JSF in entrambe le situazioni, e quella vista non può essere sia non protetta che protetta, quindi j_security_check non sembrerebbe gestire questo scenario.

Quindi, due domande:

1) j_security_check può essere manipolato per ottenere questa funzionalità? o 2) Qual è il modo "normale" in cui le webapp JSF / JavaEE ottengono questo se j_security_check non può?

Author: user815806, 2012-11-28

1 answers

L'utente connesso è disponibile anche in pagine non protette. Si potrebbe semplicemente eseguire un controllo di accesso controllando la presenza di HttpServletRequest#getRemoteUser() e un controllo di ruolo da parte HttpServletRequest#isUserInRole() e rendere i componenti limitati di conseguenza.

Ad esempio, mostra il pulsante "accedi per modificare" solo quando l'utente non è connesso:

<h:commandButton 
    value="Login to edit" action="#{auth.login}" 
    rendered="#{empty request.remoteUser}" />

E mostra il pulsante "modifica" solo quando l'utente ha effettuato l'accesso o ha il ruolo desiderato:

<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{not empty request.remoteUser}" />
<!-- or -->
<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{request.isUserInRole('ADMIN')}" />
 1
Author: BalusC, 2012-11-28 12:49:34