Duvida autenticação com JSF + XHTML

14 respostas
L
Boa noite galera, estou com uma grande duvida, sou iniciante no uso de jsf, tenho uma aplicação em que estou rodando facelets + richfaces 3.2 , a duvida é o seguinte:

eu precisava incluir nas paginas xhtml alguma maneira de verificar se o usuario está autenticado, e se tem acesso para acessar aquela página, no jsp eu faria algo como

<% Usuario user = (Usuario) request.getSession.getParameter(user)

ai depois de ter o usuario que esta logado na sessao eu verificaria se ele tem direito de acesso a pagina, se nao ja dispacho ele para tela de login ou de eventual erro

%>

já em uma página .xhtml eu nao consigo criar o <% %> , como eu posso fazer essa verificação em uma pagina .xhtml ?

Muito obrigado pela atenção galera…

Abraço

14 Respostas

C

Seria interessante vc utilizar o JAAS(autenticação J2EE), ou então utilizar alguma implementação de Filter de acesso.

O Filtro é mais simples mas o JAAS é mais poderoso.

http://www.guj.com.br/java.tutorial.artigo.184.1.guj

[]´s

L

carlos.abreu:
Seria interessante vc utilizar o JAAS(autenticação J2EE), ou então utilizar alguma implementação de Filter de acesso.

O Filtro é mais simples mas o JAAS é mais poderoso.

http://www.guj.com.br/java.tutorial.artigo.184.1.guj

[]´s


Eu até cheguei a utilizar o JAAS, mas no projeto estamos querendo desacoplar a camada web da persistencia em servidores diferentes, intao ja fugiria do nosso escopo essa solução, tem algum jeito de usar JAAS sem acessar diretamente ao banco, utilizando por exemplo um EJB?
Você conhece alguma documentação com exemplo de implementação de um Filter de acesso??
Muito Obrigado!

ericogr

No projeto que estou trabalhando (jsf+facelets+spring+jpa), utilizamos o acegi http://www.acegisecurity.org/
Com ele vc tem muuuitas opções e maneiras de controlar a autenticação e acesso de usuários.
Acho que vale a pena dar uma olhada, principalmente se vc estiver usando Spring.

abs

C

No meu caso eu uso um Filter e faço essa verificação antes de abrir a página JSF, dentro do próprio filter.

O Legal é que qualquer mudança na lógica de permissões, não implica em alterações no código.

L

Como funciona este filter amigos alguem pode dar um exemplo aew por gentileza .

C

Exemplo de Filter para login:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;


public class LoginRedirectFilter implements Filter {
	
	public void destroy() {
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws ServletException, IOException {
		
			HttpServletRequest request = (HttpServletRequest)req;
			//HttpServletResponse response = (HttpServletResponse)res;
			
			String uri = request.getRequestURI();
		
			if (uri.indexOf("/sistemaweb")<0) {
				chain.doFilter(req, res);				
			} else {				
				Object loginBean = request.getSession().getAttribute("loginBean");
				if ((loginBean!=null) 
					&& (loginBean instanceof LoginBean) 
					&& (((LoginBean)loginBean).getUsuario().getId()!=null)) {
					
					if (uri.indexOf("login.faces")>=0) {
						RequestDispatcher rd = request.getRequestDispatcher("/sistemaweb/home.faces");
						rd.forward(req, res);
					} else {
						//aqui pode-se fazer as valições de permissão de acesso
						//String uri = request.getRequestURI();
						
						chain.doFilter(req, res);
					}
					
				} else {
				RequestDispatcher rd = request.getRequestDispatcher("login.faces");
				rd.forward(req, res);
				}
			}
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

}

No web.xml vc coloca o seguinte:

<filter> 	 
	<filter-name>login-redirect-filter</filter-name>
	<filter-class>br.com.outros.pacotes.LoginRedirectFilter</filter-class>
  </filter>

  <filter-mapping>
	<filter-name>login-redirect-filter</filter-name>
	<url-pattern>*.faces</url-pattern>
  </filter-mapping>

Espero ter ajudado.

L

ccalixto:
Exemplo de Filter para login:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;


public class LoginRedirectFilter implements Filter {
	
	public void destroy() {
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws ServletException, IOException {
		
			HttpServletRequest request = (HttpServletRequest)req;
			//HttpServletResponse response = (HttpServletResponse)res;
			
			String uri = request.getRequestURI();
		
			if (uri.indexOf("/sistemaweb")<0) {
				chain.doFilter(req, res);				
			} else {				
				Object loginBean = request.getSession().getAttribute("loginBean");
				if ((loginBean!=null) 
					&& (loginBean instanceof LoginBean) 
					&& (((LoginBean)loginBean).getUsuario().getId()!=null)) {
					
					if (uri.indexOf("login.faces")>=0) {
						RequestDispatcher rd = request.getRequestDispatcher("/sistemaweb/home.faces");
						rd.forward(req, res);
					} else {
						//aqui pode-se fazer as valições de permissão de acesso
						//String uri = request.getRequestURI();
						
						chain.doFilter(req, res);
					}
					
				} else {
				RequestDispatcher rd = request.getRequestDispatcher("login.faces");
				rd.forward(req, res);
				}
			}
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

}

No web.xml vc coloca o seguinte:

<filter> 	 
	<filter-name>login-redirect-filter</filter-name>
	<filter-class>br.com.outros.pacotes.LoginRedirectFilter</filter-class>
  </filter>

  <filter-mapping>
	<filter-name>login-redirect-filter</filter-name>
	<url-pattern>*.faces</url-pattern>
  </filter-mapping>

Espero ter ajudado.


Vou testar essa implementação, muitissimo obrigado…

Abraço

L

Estou tendo um erro quando digito o usuario e senha para autenticar…
se eu digito na mao o endereco http://localhost:8080/Cockpit/pages/home.jsf depois de autenticado rola normal…agora o redirecionamento automatico nao rola…

SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.faces.application.ViewExpiredException: viewId:/CockPit/pages/home.jsf - View /CockPit/pages/home.jsf could not be restored.
	at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:187)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:276)
	at org.ajax4jsf.FastFilter.doFilter(FastFilter.java:163)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at br.com.sametrade.cockpit.handler.LoginRedirectFilter.doFilter(LoginRedirectFilter.java:37)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
package br.com.sametrade.cockpit.handler;

import java.io.IOException;   

import javax.servlet.Filter;   
import javax.servlet.FilterChain;   
import javax.servlet.FilterConfig;   
import javax.servlet.RequestDispatcher;   
import javax.servlet.ServletException;   
import javax.servlet.ServletRequest;   
import javax.servlet.ServletResponse;   
import javax.servlet.http.HttpServletRequest; 

public class LoginRedirectFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws ServletException, IOException {

		HttpServletRequest request = (HttpServletRequest) req;
		// HttpServletResponse response = (HttpServletResponse)res;

		String uri = request.getRequestURI();

		if (uri.indexOf("/CockPit") < 0) {
			chain.doFilter(req, res);
		} else {
			Object loginBean = request.getSession().getAttribute("loginHandler");
			if ((loginBean != null) && (loginBean instanceof LoginHandler)
					&& (((LoginHandler) loginBean).getCodigo() != null)) {

				if (uri.indexOf("login.jsf") >= 0) {
					RequestDispatcher rd = request
							.getRequestDispatcher("/CockPit/pages/home.jsf");
					rd.forward(req, res);
				} else {
					// aqui pode-se fazer as valições de permissão de acesso
					// String uri = request.getRequestURI();

					chain.doFilter(req, res);
				}

			} else {
				RequestDispatcher rd = request
						.getRequestDispatcher("login.jsf");
				rd.forward(req, res);
			}
		}
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<display-name>CockPit</display-name>

	<!-- Define a skin do richfaces. Ha varias opcoes -->
	<context-param>
		<param-name>org.richfaces.SKIN</param-name>
		<!--<param-value>DEFAULT</param-value>-->
		<!--<param-value>plain</param-value>-->
		<!--<param-value>emeraldTown</param-value>-->
		<param-value>DEFAULT</param-value>
		<!--<param-value>sakura</param-value>-->
		<!--<param-value>wine</param-value>-->
		<!--<param-value>japanCherry</param-value>-->
		<!--<param-value>ruby</param-value>-->
		<!--<param-value>classic</param-value>-->
		<!-- <param-value>deepMarine</param-value> -->
	</context-param>
	<context-param>
		<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
		<param-value>.xhtml</param-value>
	</context-param>
	<context-param>
		<param-name>facelets.REFRESH_PERIOD</param-name>
		<param-value>2</param-value>
	</context-param>
	<context-param>
		<param-name>facelets.DEVELOPMENT</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>server</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.validateXml</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.verifyObjects</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
		<param-value>com.sun.facelets.FaceletViewHandler</param-value>
	</context-param>
	<context-param>
		<param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
		<param-value>false</param-value>
	</context-param>
	<filter>
		<display-name>Ajax4jsf Filter</display-name>
		<filter-name>ajax4jsf</filter-name>
		<filter-class>org.ajax4jsf.FastFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ajax4jsf</filter-name>
		<servlet-name>Faces Servlet</servlet-name>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
	</filter-mapping>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	<login-config>
		<auth-method>BASIC</auth-method>
	</login-config>
	<filter>
		<filter-name>login-redirect-filter</filter-name>
		<filter-class>
			br.com.sametrade.cockpit.handler.LoginRedirectFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>login-redirect-filter</filter-name>
		<url-pattern>*.jsf</url-pattern> 
	</filter-mapping>
</web-app>

Alguem sabe oque pode ser? help-me plzzzz

Abs!

C

Olá,

CockPit é o nome do seu contexto? Se for, testa deixar apenas “/pages/home.jsf” ou “pages/home.jsf”

L
if (uri.indexOf("/sistemaweb")&lt;0) {

mais o que significa esta linha???

C

Eu tenho um contexto, e quero usar o login somente para as páginas que estiverem dentro do sistemaweb.

Por exemplo:

http://localhost:8080/MeuContexto/sistemaweb
http://localhost:8080/MeuContexto/site

O acesso ao /site é liberado, mas para o /sistemaweb requer o login.

É isso :slight_smile:

L

VELHO FUNCIONOU de boa aqui cara consegui acho que o problema dela é nesta linha:

} else {  
	                  RequestDispatcher rd = request.getRequestDispatcher("login.jsf");  
	                  rd.forward(req, res);  
	                  }  
	               }

fiz assim e funcionou e claro mudei as extensoes para jsf pq no meo tava mapeado assim

} else {  
	                  RequestDispatcher rd = request.getRequestDispatcher("/view/login/login.jsf");  
	                  rd.forward(req, res);  
	                  }  
	               }

cara valew brigadao abraços.

C

legal.

L

seguinte ta dando um problema qdo eu tento acessar as otras paginas que sao chamadas do menu,
as paginas simplesmente aparecem em branco e fica esta url

http://localhost:8080/MySystem2/view/login/login.jsf;jsessionid=C33BC271C98E5820D89F227BD4C307C4

o que pode ser ?
minha classe ficou assim:

package com.Lgweb.Tcc.Util;


import com.Lgweb.Tcc.Model.Usuario;
import java.io.IOException;  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.RequestDispatcher;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest; 
public class SecuritFilter implements Filter {  
	         
	       public void destroy() {  
	       }  
	     
	       public void doFilter(ServletRequest req, ServletResponse res,  
	               FilterChain chain) throws ServletException, IOException {  
	             
	               HttpServletRequest request = (HttpServletRequest)req;  
	               //HttpServletResponse response = (HttpServletResponse)res;  
	                 
	               String uri = request.getRequestURI();  
	             
	               if (uri.indexOf("/view")&lt;0) {  
	                   chain.doFilter(req, res);                 
	               } else {                  
	                   Object loginBean = request.getSession().getAttribute("usuario");  
	                   if ((loginBean!=null)   
	                       && (loginBean instanceof Usuario)   
	                       && (((Usuario)loginBean).getUsuarioid()!=null)) {  
	                         
	                       if (uri.indexOf("/view/login/login.jsf")&gt;=0) {  
	                           RequestDispatcher rd = request.getRequestDispatcher("/view/MenuSistema.jsf");  
	                           rd.forward(req, res);  
	                       } else {  
	                           //aqui pode-se fazer as valições de permissão de acesso  
	                           //String uri = request.getRequestURI();  
	                             
	                           chain.doFilter(req, res);  
	                       }  
	                         
	                } else {  
	                  RequestDispatcher rd = request.getRequestDispatcher("/view/login/login.jsf");  
	                  rd.forward(req, res);  
	                  }  
	               }  
	       }  
	    
	       public void init(FilterConfig arg0) throws ServletException {  
	       }  
	     
	   }

tds as paginas estao dentro da pasta view,cada uma em suas subpastas tipo/view/pedido, /view/cliente …

Criado 12 de maio de 2008
Ultima resposta 13 de mai. de 2008
Respostas 14
Participantes 5