tutorial template etiquetas español ejemplo jsf login

template - Seguridad Básica en JSF



templates jsf primefaces (4)

La mejor manera de hacerlo sería usar seguridad administrada por contenedor.

Aquí hay un tutorial sobre cómo lograr eso con glassfish y jsf .

Me gustaría ver una aplicación de inicio de sesión simple, aunque no tan simple como this .

Lo que me gustaría lograr es comprender cómo funciona JSF, he desarrollado mucho ASP.NET donde tienes el código y donde puedes verificar si se creó una sesión al iniciar sesión.

Una solución similar en JSF sería genial.

Esto es básicamente lo que quiero lograr:

  • Página de inicio de sesión
  • SI OK
    • Crear sesión y devolver el "éxito"
  • SI FALLA
    • devolver "falla"

(El "éxito" y la falla se asignan a faces-config.xml)

En la página de éxito, quiero estar seguro de que el usuario está conectado, por lo que uno no debería poder navegar a "success.jspx" si no tiene la sesión correcta.



Si usa plantillas, he descubierto que realmente no necesita un filtro.

index.jsp

<jsp:forward page="startup.faces"></jsp:forward>

startup.xhtml (.faces), realmente no intenta mostrar una pantalla, llama al javascript startupSubmit () al cargar y hace clic en el botón. Esto envía el flujo directamente al método start () en StartupBean.java.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> . . <script type="text/javascript"> function startupSubmit() { **document.getElementById(''startupForm:startupBtn'').click();** } </script> <h:body onload="startupSubmit()"> <h:form id="startupForm"> <p:commandButton id="startupBtn" value="" action="#{startupBean.start}" ajax="false" /> </h:form> </h:body> </html>

StartupBean.java (no es parte de template.xhtml a continuación). El método start () en StartupBean establece una variable llamada authorised to true (por defecto es false), luego salta a first.xhtml. Puede usar cualquier criterio que desee para determinar si la autorización está establecida en verdadero ... como los criterios de inicio de sesión.

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. En template.xhtml, solo dentro del formulario, coloca ah: o p: panelGrid y solo lo muestra si startupBean.authorized es verdadero. La única forma en que un usuario puede acceder a las páginas contenidas en la plantilla es primero si comienza a utilizar StartupBean.java.

<f:view> <div id="container"> <h:form id="templateForm"> **<p:panelGrid rendered="#{startupBean.authorized}">** <div id="header"> <ui:include src="header.xhtml" /> </div> <div id="wrapper"> <div id="firstId"> <ui:insert name="first"></ui:insert> </div> . . <!-- MORE PAGES --> . . </div> <div id="footer"> <ui:include src="footer.xhtml" /> </div> </p:panelGrid> </h:form> </div> </f:view>

Entonces, esa es mi solución. Lo probé bastante bien y parece funcionar bien.


No existe una funcionalidad de autenticación inherente en el núcleo JSF más allá de ser capaz de usar elementos como atributos rendered componentes orientados a la seguridad basada en roles.

De forma predeterminada, una aplicación JSF depende de los mismos mecanismos de seguridad administrados por contenedor que el componente web que la contiene ( tutorial JEE5 ). Los marcos de terceros como Seam pueden proporcionar alternativas.

Si desea agregar la seguridad de su propia aplicación, un filtro de servlet es uno de los mecanismos más simples.

Este filtro protege los recursos en el directorio restricted como se define en web.xml :

<filter> <filter-name>AuthenticationFilter</filter-name> <filter-class>restricted.AuthenticationFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthenticationFilter</filter-name> <url-pattern>/restricted/*</url-pattern> </filter-mapping>

La implementación de la clase de 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 de inicio de sesión definido en 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; } }

El formulario de inicio de sesión de JSF en la página restricted_login.jsp :

<f:view> <p><a href="restricted/secret.faces">try to go to secret page</a></p> <h:form> Username: <h:panelGroup rendered="#{not authenticationBean.loggedIn}"> <h:inputText value="#{authenticationBean.name}" /> <h:commandButton value="login" action="#{authenticationBean.login}" /> </h:panelGroup> <h:commandButton value="logout" action="#{authenticationBean.logout}" rendered="#{authenticationBean.loggedIn}" /> </h:form> </f:view>

(El URL / mecanismo de redireccionamiento se eligió por brevedad en lugar de por cualquier tipo de práctica recomendada; consulte la API de Servlet para obtener más opciones).