JSF - verificar se está logado?

Opa :smiley:

Como que eu faço para que quando os usuários tentem acessar alguma página que obrigue o login, redirecionar para o login caso ele não esteja logado?

[]'s

Olá

Verifique se na session do usuário tem algum objeto (um objeto qualquer que indique que ele esteja logado).
Se não tiver apresenta a página de login
Se o usuário digitar a senha corretamente coloque um objeto na session (aquele mesmo objeto que você verificou que não existe) para indicar que ele está logado.
A minha dica é usar um Filter para implementar isso.

Feito :smiley:

E ficou massa…vou colar o código aqui pra se alguem precisar:

package br.com.portaldascargas.filtros;

import java.io.IOException;

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

public class LoginFilter implements Filter {

	private final static String FILTER_APPLIED = "_security_filter_applied";

	public LoginFilter() {
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest hreq = (HttpServletRequest) request;
		HttpServletResponse hresp = (HttpServletResponse) response;
		HttpSession session = hreq.getSession();

		hreq.getPathInfo();
		String paginaAtual = new String(hreq.getRequestURL());

		// dont filter login.jsp because otherwise an endless loop.
		// & only filter .jsp otherwise it will filter all images etc as well.
		if ((request.getAttribute(FILTER_APPLIED) == null) && paginaAtual != null
				&& (!paginaAtual.endsWith("login.jsf"))
				&& (paginaAtual.endsWith(".jsf"))) {
			request.setAttribute(FILTER_APPLIED, Boolean.TRUE);

			// If the session bean is not null get the session bean property
			// username.
			String user = null;
			if (((br.com.portaldascargas.jsf.bean.login.Login) session
					.getAttribute("login")) != null) {
				 user =
				 ((br.com.portaldascargas.jsf.bean.login.Login)session.getAttribute("login")).getLoginBean().getUsuario();
			}

			if ((user == null) || (user.equals(""))) {
				hresp.sendRedirect("/paginas/login/login.jsf");
				return;
			}

		}
		// deliver request to next filter
		chain.doFilter(request, response);
	}
}

web.xml

	<filter>
		<filter-name>Login Filter</filter-name>
		<filter-class>br.com.portaldascargas.filtros.LoginFilter</filter-class>
	</filter>


	<filter-mapping>
		<filter-name>Login Filter</filter-name>
		<url-pattern>*.jsf</url-pattern>
	</filter-mapping>

Cara valeu por postar este codigo, funciona legalzinho, vou dar uma olhada com calma neste assunto para não ser apenas um repetidor de ideias, sem saber como funciona…rsrs

Aee pessoal sou novo no fórum… oi para todos…

Bom estou fazendo um sistema web aqui, e nele utilizo uma classe que implementa PhaseListener…
Com essa classe você consegue proteger sua aplicação de ações maldosas, como por exemplo alguem tentar entar no sistema, sem estar devidamente logado… bem como se você definir um tempo de inatividade para a session, quando a mesma expirar, essa classe irá lhe redirecionar para a página de login…

Se interessar, é só dar o toque que posto os códigos aqui no fórum…

vlw pessoal…

[quote=ostreicher]Aee pessoal sou novo no fórum… oi para todos…

Bom estou fazendo um sistema web aqui, e nele utilizo uma classe que implementa PhaseListener…
Com essa classe você consegue proteger sua aplicação de ações maldosas, como por exemplo alguém tentar entrar no sistema, sem estar devidamente logado… bem como se você definir um tempo de inatividade para a session, quando a mesma expirar, essa classe irá lhe redirecionar para a página de login…

Se interessar, é só dar o toque que posto os códigos aqui no fórum…

vlw pessoal…[/quote]

Vejam também o verificador de phase que implementei!

Pessoal, não consigo implementar um controle de acesso decente em meu projeto. Se eu uso filter minha página não funciona (aparentemente não carrega o CSS)! E se eu uso PhaseListener, uma hora não funciona os componentes ICEfaces (quando eu redireciono as páginas com o NavigationHandle), e outra hora dá um erro no Browser dizendo que a página contém um Loop de redirecionamento… não sei o que mais fazer! Tudo o que queria fazer é o seguinte:

Tenho minha página do projeto, por exemplo: http://localhost/projeto que carrega uma tela de login. E que após o usuário se logar, o usuário é redirecionado para uma página principal (mas na URL do browser continua aparecendo http://localhost/projeto) porém, quando o usuário der um refresh na página ele redirecionado para tela de login… O que eu quero é se o usuário já estiver logado, este seja redicionado direto para a página principal…

Será que alguém poderia dar uma força? Obrigado!

voce faz navegação via retorno de string?

definiu as navigation-rules na faces-config.xml ?

tipo:

    <navigation-rule>
        <from-view-id>/login.xhtml</from-view-id> //-- Página origem que gera String de redirecionamento
        <navigation-case>
            <from-outcome>prossegue</from-outcome> // -- String retornada por um metodo
            <to-view-id>/main.xhtml</to-view-id> // -- Página destino
            <redirect/>
        </navigation-case>
    </navigation-rule>

veja a minha implementação de PhaseListener. PhaseListener só aceita redirecionamento via Faces.

Sim, eu defini as navigation-rules no faces-config.xml…

E quando você fala sua implementação de PhaseListener, você se refere a esse link: http://www.guj.com.br/java/229218-problemas-com-ge...cao-de-phaselistener/1#1175542 ??

Se for, eu tentei fazer da mesma maneira, mas dá um erro no browser (Google Chrome) dizendo que a página contém um Loop de redicionamento…
E também, na sua implementação não há necessidade de definir as navigation-rules no faces-config.xml, certo?

[quote=felipebbarbosa]Sim, eu defini as navigation-rules no faces-config.xml…

E quando você fala sua implementação de PhaseListener, você se refere a esse link: http://www.guj.com.br/java/229218-problemas-com-ge...cao-de-phaselistener/1#1175542 ??

Se for, eu tentei fazer da mesma maneira, mas dá um erro no browser (Google Chrome) dizendo que a página contém um Loop de redicionamento…
E também, na sua implementação não há necessidade de definir as navigation-rules no faces-config.xml, certo?[/quote]

Então o erro está na ordem com que as páginas são carregadas.

Talvez voce redireciona para uma pagina que redireciona (automaticamente) para outra. Melhor postar os codigos para ficar mais facil identificar o problema.

A minha implementação é simples, só verifica se há alguem logado, se tem ele manda pra tela principal, se nao tem ele manda pra tela de login ^^

E sim, defino as navigation rules na faces-config

voce está usando template para o seu sistema?

Talvez tenha problemas com IEx se não usar D:

É exatamente isso que eu quero fazer =/

Vamos lá…

Meu PhaseListener:

public class ControleAcessoListener implements PhaseListener {
	
	private static final long serialVersionUID = 9000846487985704196L;	
			
	public ControleAcessoListener() {		
	}
	
	public void afterPhase(PhaseEvent event) {
		try {
			
			FacesContext context = event.getFacesContext();			
			HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();			
			HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
			
			Boolean conectado = (Boolean) session.getAttribute("autenticado");			
			
			if (conectado == null) {
				return;
			}
			
			// can't use this here. only valid at render response phase?
			String viewId = context.getViewRoot().getViewId();
			System.out.println(viewId);
			
			if (!conectado) {	
				System.out.println("desconectado");
				FacesContext.getCurrentInstance().getExternalContext().redirect("/gemap-scada-jsf/index.jsp");
			} else {
				System.out.println("conectado");
				FacesContext.getCurrentInstance().getExternalContext().redirect("/gemap-scada-jsf/main.xhtml");
			}
			
			response.setHeader("Expires", "-1");
			response.setHeader("Cache-Control", "no-store, no-cache, must-revalidade, proxy-revalidade, private, post-check=0, pre-check=0");
			response.setHeader("Pragma", "no-cache");
						
		} catch (Exception e) {			
		}
	}

	public void beforePhase(PhaseEvent event) {		
	}	
	
	public PhaseId getPhaseId() {		
		return PhaseId.RESTORE_VIEW;
	}

Minha tela de login:

[code]

<h:head>
#{msgs.apptitle}
<h:outputStylesheet library=“css” name=“estilo.css”/>
</h:head>
<h:body>


<ice:form id=“loginForm” partialSubmit=“true”>
<h:panelGrid style=“padding-top: 15px;” border=“0” columns=“2”>
<ice:outputText value="#{msgs.login}" styleClass=“login-label” style=“color:white;”/>
<ice:inputText styleClass=“login-box” id=“campo-login” value="#{loginBean.usuario.login}"/>
<ice:outputText value="#{msgs.senha}" styleClass=“login-label” style=“color:white;”/>
<ice:inputSecret styleClass=“login-box” id=“campo-senha” value="#{loginBean.usuario.senha}"/>
</h:panelGrid>

<ice:message for=“campo-login” errorClass=“login-erro”/>

<ice:commandButton styleClass=“login-botao” value="#{msgs.loginButton}"
action="#{loginBean.logar}"/>

</ice:form>

</h:body> [/code]

Login Bean:

@ManagedBean
@ViewScoped
public class LoginBean {
	private Session session;	
	private Usuario usuario = new Usuario();
	// gets e sets do Usuario...
	
	public String logar() {
		session = HibernateUtil.openSession();		
		try {			
			if (validaUsuario()) {		
				usuario = new UsuarioDao(session).loadUsuario(usuario.getLogin());

				FacesContext facesContext = FacesContext.getCurrentInstance();
				HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(true);				
				httpSession.setAttribute("autenticado", true);
				httpSession.setAttribute("usuario", usuario);
				
				return "/main";				
			} else {				
				FacesContext facesContext = FacesContext.getCurrentInstance();
				HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(true);				
				httpSession.setAttribute("autenticado", false);				
				return null;
			}			
		} finally {
			HibernateUtil.closeCurrentSession();
		} 
		
	}
	
	public String sair() {
		HttpSession httpSession = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		httpSession.removeAttribute("autenticado");
		httpSession.removeAttribute("usuario");
		
		return "/login";
	}
	
	public boolean validaUsuario() {
		FacesContext context = FacesContext.getCurrentInstance();
		UsuarioDao usuarioDao = new UsuarioDao(session);
		if (usuarioDao.verificaUsuario(usuario.getLogin(), usuario.getSenha())) {
			FacesMessage message = new FacesMessage();
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			message.setSummary("Usuário Inválido");			
			message.setDetail("Login e/ou Senha Inválido(s).");			
			context.addMessage("loginForm:campo-login", message);
			return false;
		} else {			
			return true;
		}
	}
}

Minha página principal:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"			
			xmlns:ice="http://www.icesoft.com/icefaces/component"
			xmlns:h="http://java.sun.com/jsf/html"
			xmlns:f="http://java.sun.com/jsf/core"
			xmlns:ui="http://java.sun.com/jsf/facelets">						
<ui:composition template="./template/default.xhtml">	
	<ui:define name="main-content-panel">		
		<ice:panelGroup id="tabs" styleClass="panelTabSetContainer">
				<ice:form>
				<ice:panelTabSet id="iceTabSet"	selectedIndex="#{tabsBean.focusIndex}"
						tabPlacement="#{tabsBean.tabPlacement}" 
						tabChangeListener="#{tabsBean.processTabChange}"
						title="Teste Title" summary="Teste Summary" >				

					<ice:panelTab label="Aba 1" title="Aba 1">					
						<div id="tab01">											
							<ice:outputLabel value="template"></ice:outputLabel>							
						</div>									
					</ice:panelTab>
					
					<ice:panelTab label="Aba 2" title="Aba 2">					
						<div id="tab02">
							<ice:outputText value="Tab2"></ice:outputText>
						</div>									
					</ice:panelTab>
					
					<ice:panelTab label="Aba 3" title="Aba 3">					
						<div id="tab03">
							<ice:outputText value="Tab3"></ice:outputText>
						</div>									
					</ice:panelTab>						
				</ice:panelTabSet>
				</ice:form>					
			</ice:panelGroup>		
	</ui:define>
</ui:composition>
</html>

Página Default (Template):

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"			
			xmlns:ice="http://www.icesoft.com/icefaces/component"
			xmlns:h="http://java.sun.com/jsf/html"
			xmlns:f="http://java.sun.com/jsf/core"
			xmlns:ui="http://java.sun.com/jsf/facelets">			
<f:view>
<h:head>
	<title><ui:insert name="title">#{msgs.apptitle}</ui:insert></title>	
</h:head>
<h:body>	
	<h:outputStylesheet library="css" name="estilo.css"/>	
	<ice:outputStyle href="./xmlhttp/css/rime/rime.css"/>	
	<ui:insert name="header-panel">
		<ui:include src="/template/header.xhtml"/>								
	</ui:insert>
		
	<div id="conteudo">
		<ui:insert name="content-panel">			
			<ice:panelGroup id="menu-dispositivos">
				<ui:insert name="device-menu-panel">						
						<ice:form>
							<ice:panelGroup styleClass="treeContainer">								
									<ice:tree id="tree" value="#{mainBean.model}" var="item" hideRootNode="true"
										hideNavigation="false" imageDir="./xmlhttp/css/rime/css-images/">										
										<ice:treeNode>
											<f:facet name="icon">
												<ice:panelGroup style="display:inline;">
													<h:graphicImage value="#{item.userObject.icon}"></h:graphicImage>
												</ice:panelGroup>
											</f:facet>		
											<f:facet name="content">
												<ice:panelGroup style="display:inline;">
													<ice:commandLink value="#{item.userObject.text}"></ice:commandLink>
												</ice:panelGroup>
											</f:facet>									
										</ice:treeNode>										
									</ice:tree>								
							</ice:panelGroup>
						</ice:form>					
				</ui:insert>
			</ice:panelGroup>			
			<ice:panelGroup styleClass="painel-principal">
				<ui:insert name="main-content-panel">				
					<ice:outputLabel value="template"></ice:outputLabel>				
				</ui:insert>			
			</ice:panelGroup>							
		</ui:insert>
	</div>
		
	<ui:insert name="footer-panel">
		<ui:include src="/template/footer.xhtml"/>
	</ui:insert>				
</h:body>
</f:view>
</html>

faces-config:

<faces-config
    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-facesconfig_2_0.xsd"
    version="2.0">

<lifecycle>
   <phase-listener>br.com.projeto.listener.ControleAcessoListener</phase-listener>
</lifecycle>			    

</faces-config>

web.xml:

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

  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
    
  <context-param>    
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>  
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  
  <context-param>
  	<param-name>javax.faces.PROJECT_STAGE</param-name>
  	<param-value>Development</param-value>
  </context-param>
  
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
  
  <context-param>
    <description>Google Maps API key is required if gMap component is used. Sign up for an API key from http://code.google.com/apis/maps/signup.html</description>
    <param-name>com.icesoft.faces.gmapKey</param-name>
    <param-value>ABQIAAAADlu0ZiSTam64EKaCQr9eTRTOTuQNzJNXRlYRLknj4cQ89tFfpxTEqxQnVWL4k55OPICgF5_SOZE06A</param-value>
  </context-param>
  
  <servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>com.icesoft.faces.webapp.CompatResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/xmlhttp/*</url-pattern>
  </servlet-mapping>
  
  <listener>
  	<listener-class>br.com.projeto.listener.MySessionListener</listener-class>
  </listener>

  <servlet-mapping>
  	<servlet-name>Faces Servlet</servlet-name>
  	<url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
  
  <filter>
  	<filter-name>SessionTimeoutFilter</filter-name>
  	<filter-class>br.com.projeto.filter.SessionTimeoutFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>SessionTimeoutFilter</filter-name>
  	<url-pattern>*.xhtml</url-pattern>
  </filter-mapping>
      
</web-app>

No metodo afterPhase() voce esqueceu de referenciar a currentInstance, deveria estar assim

mas eu não consegui identificar ainda aonde está o problema.

Eu desenvolvo PrimeFaces, não conheço a IceFaces

[code]public void afterPhase(PhaseEvent event) {
try {

		FacesContext context = event.getFacesContext();			
		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();			
		HttpSession session = (HttpSession) context.getCurrentInstance().getExternalContext().getSession(true);
		
		Boolean conectado = (Boolean) session.getAttribute("autenticado");			
		
		if (conectado == null) {
			return;
		}
		
		// can't use this here. only valid at render response phase?
		String viewId = context.getViewRoot().getViewId();
		System.out.println(viewId);
		
		if (!conectado) {	
			System.out.println("desconectado");
			FacesContext.getCurrentInstance().getExternalContext().redirect("/gemap-scada-jsf/index.jsp");
		} else {
			System.out.println("conectado");
			FacesContext.getCurrentInstance().getExternalContext().redirect("/gemap-scada-jsf/main.xhtml");
		}
		
		response.setHeader("Expires", "-1");
		response.setHeader("Cache-Control", "no-store, no-cache, must-revalidade, proxy-revalidade, private, post-check=0, pre-check=0");
		response.setHeader("Pragma", "no-cache");
					
	} catch (Exception e) {			
	}
}

[/code]

Até porque estou com um puta problema aqui pra resolver com upload de arquivos :?

Pois é, eu também não consegui identificar o problema =/

Mas de qualquer forma, muito obrigado pela ajuda Takeshi91!

de nada, tamo ae pra isso

eu to migrando um sistema Java Swing para JSF e aprendendo JSF ao mesmo tempo (pq num sabia nada) ‘-’

#SóMeFodo

Agora mudando um pouco o código no PhaseListener para o redirecionamento:

FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation(context, null, "main");

com navigation-rule no faces-config.xml:

<navigation-rule>
	<from-view-id>/*</from-view-id>
	<navigation-case>
		<from-outcome>main</from-outcome>
		<to-view-id>/main.xhtml</to-view-id>
	</navigation-case>
</navigation-rule>

“Funciona”! Porém, mas nenhum elemento da página funciona, ou seja, o Tabset do ICEfaces fica travado, o Tree fica travado, nem mesmo o link de sair funciona!!

[quote]de nada, tamo ae pra isso

eu to migrando um sistema Java Swing para JSF e aprendendo JSF ao mesmo tempo (pq num sabia nada) ‘-’

#SóMeFodo[/quote]

Eu também estou aprendendo JSF… venho do Struts 1.x!
Estou apanhando “um pouco”! rsrsrs

manolo, to doidão de sono.

amanha eu leio direito seu código e tento identificar o problema

to tratando manipulação de arquivo aqui

migrando um sistema feito em duas camadas para 3 camadas (MVC)

Resolvi modificando meu if no PhaseListener:

String viewId = event.getFacesContext().getViewRoot().getViewId();
System.out.println(viewId);
if (!conectado && !viewId.equals("/login.xhtml")) {
	System.out.println("desconectado");
	FacesContext
			.getCurrentInstance()
			.getApplication()
			.getNavigationHandler()
			.handleNavigation(event.getFacesContext(), null, "login");
	return;
} 
if (conectado && viewId.equals("/login.xhtml")) {
	System.out.println("conectado");
	FacesContext
			.getCurrentInstance()
			.getApplication()
			.getNavigationHandler()
			.handleNavigation(event.getFacesContext(), null, "main");
}

Valeu…