Sicurezza di base in JSF

Mi piacerebbe vedere una semplice applicazione di login, non così semplice però.

Quello che vorrei ottenere è capire come funziona JSF, ho sviluppato molto ASP.NET dove hai il codice e dove puoi controllare se una sessione è stata creata su Login.

Una soluzione simile in JSF sarebbe grandiosa.

Questo è fondamentalmente ciò che voglio ottenere:

  • Pagina di login
  • SE BENE
    • Crea sessione e restituisci “successo”
  • SE FAIL
    • return “failure”

(Il “successo” e l’errore sono mappati a faces-config.xml)

Alla pagina di successo voglio essere certo che l’utente abbia effettuato l’accesso, quindi non si dovrebbe essere in grado di navigare su “success.jspx” se non si ha la sessione corretta.

Non esiste alcuna funzionalità di autenticazione intrinseca nel JSF principale oltre alla possibilità di utilizzare elementi come gli attributi di rendered componenti orientati alla sicurezza basata sui ruoli.

Per impostazione predefinita, un’applicazione JSF si basa sugli stessi meccanismi di sicurezza gestiti dal contenitore del componente Web che lo contiene ( esercitazione JEE5 ). Strutture di terze parti come Seam possono fornire alternative.

Se si desidera aggiungere la propria sicurezza dell’applicazione, un filtro servlet è uno dei meccanismi più semplici.

Questo filtro protegge le risorse nella directory restricted come definito in web.xml :

   AuthenticationFilter restricted.AuthenticationFilter   AuthenticationFilter /restricted/*  

L’implementazione della class filtro:

 public class AuthenticationFilter implements Filter { private FilterConfig config; public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { if (((HttpServletRequest) req).getSession().getAttribute( AuthenticationBean.AUTH_KEY) == null) { ((HttpServletResponse) resp).sendRedirect("../restricted_login.faces"); } else { chain.doFilter(req, resp); } } public void init(FilterConfig config) throws ServletException { this.config = config; } public void destroy() { config = null; } } 

Un bean di accesso definito in faces-config.xml :

 public class AuthenticationBean { public static final String AUTH_KEY = "app.user.name"; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isLoggedIn() { return FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().get(AUTH_KEY) != null; } public String login() { FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( AUTH_KEY, name); return "secret"; } public String logout() { FacesContext.getCurrentInstance().getExternalContext().getSessionMap() .remove(AUTH_KEY); return null; } } 

Il modulo di accesso JSF nella pagina restricted_login.jsp :

   

try to go to secret page

Username:

(L’URL / meccanismo di reindirizzamento è stato scelto per brevità piuttosto che per qualsiasi tipo di best practice, consultare l’ API Servlet per ulteriori opzioni.)

Se sei disposto a provare un approccio un po ‘più avanzato, ti suggerisco di guardare in spring-security + JSF. Esso funziona magicamente.

Puoi scrivere la tua domanda come se non fosse in sicurezza e quindi configurare solo le aree che dovrebbero essere protette usando aspetti.

Sicurezza di spring: http://static.springsource.org/spring-security/site/

Un tutorial: http://ocpsoft.com/java/acegi-spring-security-jsf-login-page/

Il modo migliore per farlo sarebbe utilizzare la sicurezza gestita dal contenitore.

Ecco un tutorial su come ottenerlo con glassfish e jsf .

Se usi i modelli, ho trovato che non hai davvero bisogno di un filtro.

index.jsp

  

startup.xhtml (.faces), in realtà non tenta di mostrare una schermata, chiama javascript startupSubmit () al caricamento e fa clic sul pulsante. Questo invia il stream direttamente al metodo start () in StartupBean.java.

  . .        

StartupBean.java (non fa parte del template.xhtml di seguito). Il metodo start () in StartupBean imposta una variabile denominata autorizzata su true (è impostata su false), quindi passa a first.xhtml. È ansible utilizzare qualsiasi criterio che si desidera determinare se autorizzato è impostato su true … come i criteri di accesso.

 package gov.irs.eservices.managementBeans; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean(name="startupBean") @SessionScoped public class StartupBean { private boolean authorized; public StartupBean() { } public String start() { **setAuthorized(true);** return "first"; } public boolean isAuthorized() { return authorized; } public void setAuthorized(boolean authorized) { this.authorized = authorized; } } 

template.xhtml. In template.xhtml, proprio all’interno del form, si posiziona ah: or p: panelGrid e lo si esegue solo se startupBean.authorized è true. L’unico modo in cui un utente può accedere alle pagine contenute nel modello è se provengono prima da StartupBean.java.

  
****
. . . .

Quindi, questa è la mia soluzione. L’ho testato abbastanza bene e sembra funzionare bene.