Problema com Filtro de Sessão + JSF 2.0

Olá galera boa tarde!

Pessoal , estou com o seguinte problema:

Contextualizando:

Temos uma tela de login.xhtml, onde ao acessar o sistema o usuário é redirecionado automaticamente. O Problema consiste no momento de consistir os dados de entrada através de filtros de sessão.
Primeiramente estou usando JSF 2.0 e SERVLET FILTER, ou seja, estou usando um filtro para verificar se o usuário está realmente logado no sistema (Se o mesmo está devidamente registrado na sessão) , ou se simplesmente acessou pelo URL diretamente, neste caso, o mesmo deverá ser redirecionado para a tela de login.xhtml.
Até ai, tudo bem, consegui fazer o tratamento e saber se o usuário está logado ou não em cada situação, o problema é que não estou conseguindo redirecionar o usuário de volta para a página de login quando o mesmo não possui permissão, ou seja, não está logado adequadamente.

Código do meu filtro:

FiltroSessao.java


	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		HttpSession sessao = ((HttpServletRequest) request).getSession();
			
		if(sessao.getAttribute("usuario") == null){
			
			System.out.println("USUÁRIO NÃO AUTORIZADO");
			
			((HttpServletResponse) response).sendRedirect("../login/login.jsf");
						
			return;
					
		}
		else{
			System.out.println(sessao.getAttribute("usuario"));
			
			System.out.println("USUÁRIO LOGADO");		
		}
		
		chain.doFilter(request, response);
	}


Web.xml:


<filter>
 	<filter-name>Filtro</filter-name>
 	<filter-class>utils.FiltroSessao</filter-class>
 </filter>
 
 <filter-mapping>
 	<filter-name>Filtro</filter-name>
 	<url-pattern>*.jsf</url-pattern> 	
 </filter-mapping>

Estou redirecionando minha aplicação a partir de um arquivo html, que será a primeira página a abrir no sistema antes de redirecionar para o login.


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="refresh" content="2;url=content/login/login.jsf">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

Configurei meu eclipse para abrir no FIREFOX, portanto o erro está sendo apresentado no navegador do FIREFOX. Ele simplesmente não reconhece o URL aberto.
Testamos no IE 8 e o aplicativo entra em lopping e cai sempre na mesma condição de usuário não autorizado do FILTRO, ou seja, a página de login nem é aberta.

Pessoal, vocês tem alguma idéia do que possa ser ??
Já pesquisei MUITO , mas não achei nada esclarecedor.

Muito obrigado , desde já.

abraços !




Pode ser a url da pagina que está errada. Coloca o caminho completo.

Olá Amigo, obrigado pela ajuda,
então, testamos de várias maneiras, e vimos que o problema não é referente a url.
pois quando tiramos a linha de redireciomento abaixo, o sistema carrega a primeira página, porém as demais páginas não serão redirecionadas para a tela de login, caso o usuário não esteja logado:

	((HttpServletResponse) response).sendRedirect("../login/login.jsf");						
                return;

funciona a primeira chamada para o login, que aponta para a url: http://localhost:8080/arquitetura/content/login/login.jsf.

que é a mesma url quando o erro acontece.

Mais alguma sugestão galera?

Desculpe, mas ainda acho que é o redirecionamento. Olha a mensagem de erro.

Isso aqui
http://localhost:8080/arquitetura/content/login/login.jsf.

é diferente, e muito de
…/login/login.jsf

Sim Jakefrog, o caminho é diferente, ja testamos desta forma, e com vários outros caminhos,

porém quando colocamos o “…/login/login.jsf” ele monta a url completa desconsiderando os diretórios anteriores.

Quando abre a tela do navegador onde ele está o erro, o caminho que apontado é: http://localhost:8080/arquitetura/content/login/login.jsf,

Porém o mesmo é aberto através do seguinte comando:

((HttpServletResponse) response).sendRedirect("../login/login.jsf");						
			return;

Bom, Mandei a imagem do meu diretório no primeiro post,
baseada nela, Por favor, Você tem uma idéia de como preencheriamos entao o sendRedirect(???)

Obrigado!

De cabeça não sei. Mas tenta aí…

/content/login/login.jsf
/content/login/login.xhtml

ou

content/login/login.jsf
content/login/login.xhtml

Então, já havíamos testado com todos estes caminhos, por isso achamos que mesmo que pareça ser um erro de caminho, possa ser alguma outra coisa.

Até porque quando definimos o caminho …/login/login.jsf ele encontra o projeto e a pasta content/ no diretório anterior

/content/login/login.jsf.

Este caminho que abre no momento do erro é exatamente igual ao caminho que abre quando funciona sem o redirecionamento (sem o sendRedirect), ou seja, acredito que esteja correto.

Já ví exemplos muito parecidos em versões anteriores do JSF, no caso JSF 1.2 funcionando perfeitamente, será que pode ser alguma característica nova relacionada a versão do JSF 2.0 ?

se alguém já passou por isso ou se quiserem alguma informação por favor me notifiquem.

Obrigado !!

sendRedirect usa o endereço local relativo…então as vezes pode não funcionar no endereço da URL. Coloque o endereço completo dinâmico no filtro para evitar isso:

HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; HttpSession sessao = req.getSession(); Object user = sessao.getAttribute(USUARIO); if (user != null) { // Usuario logado continua a execução. chain.doFilter(request, response); return; } // Não tem usuario logado, redireciona para login, indicando o erro // de tentativa de acesso. res.sendRedirect(req.getContextPath() + "/publico/login.jsf?user=1"); H
Obs - não tem nada relacionado com JSF.

Pessoal obrigado pelo auxilio.

Bom, estamos estudando o Framework Spring Security 3.1 para controle de acesso e segurança das informações.

BOm, se alguém tiver alguma opinião sobre este framework, ou quiser recomendar algum outro, por favor fiquem a vontade.

Obrigado.

[quote=Lael Santos]Pessoal obrigado pelo auxilio.

Bom, estamos estudando o Framework Spring Security 3.1 para controle de acesso e segurança das informações.

BOm, se alguém tiver alguma opinião sobre este framework, ou quiser recomendar algum outro, por favor fiquem a vontade.

Obrigado.[/quote]

Spring é legal mas é bem engessado. Se na sua avaliação ele se encaixar legal, dai beleza! Agora se ele não se encaixar 100% vc vai se matar para customizar ele, entrando no nas classes proprietárias da spring, sem muita informação. Eu usei ele durante 2 anos e hoje já migrei para um framework proprio baseado em servlet filter.

Qualquer coisa - http://fernandofranzini.wordpress.com/2009/09/09/autenticacao-e-autorizacao/

Olá Fernando obrigado pelo auxílio e parabéns pelo site, muito bacana a postagem sobre algumas das possibilidades de implementação da autenticação e autorização.

lael eu redireciono pelo managedbean usando esse código abaixo:

FacesContext context = FacesContext.getCurrentInstance(); context.getExternalContext().redirect("/BillVerificationSemSecurity/home.jsf");

e funciona perfeitamente!

uma pergunta, basta eu fazer esse teste que quando forem acessar pela url, independente qual seja, se não estiver logado não vai conseguir!?

e uma dica, eu estava usando spring security para fazer justamente o que você quer. Sofri demais para customiza-lo, sem conseguir muitas informações pela internet. Informações quebradas…e que quando ia implementar faltava alguns detalhes que não achava de maneira alguma e consequentemente não conseguia implementar.
Se for usar, tenha alguém na equipe que saiba e conheça deste framework, porque as informações pela internet são escassas.

abs