Dúvida sobre JSF

Olá,

Estou começando a futucar JSF agora e estou tentando implementar um Login…

No meu login eu gostaria de recuperar um atributo da sessão e verificar se o usuário está autenticado antes de executar qualquer método de qualquer bean.

Peguei um bean da aplicação e fiz o tratamento no seu construtor, dando um redirect quando necessário. Como previsto, ele funciona na primeira vez, mas nas próximas da pau…

Não quero ter que implementar a verificação em todos os métodos do bean, como faço para colocar em um lugar só???

O construtor da classe está escrito abaixo (parecida com a do tutorial do site)


public AgendaDB(){
		try{
			Object session = context.getExternalContext().getSession(false);
			ViewHandler vh = context.getApplication().getViewHandler();
			String viewUrl = vh.getActionURL(context, "/index.jsf");
			if(session == null)
				context.getExternalContext().dispatch(viewUrl);
			else
			{
				HttpSession sessao = (HttpSession) session;
				System.out.println("VAlor em sessao = " + sessao );
				System.out.println("VAlor em atributo da sessao = " + sessao.getAttribute("autenticacao") );
				if(sessao.getAttribute("autenticacao") == null)
				{   
					System.out.println("fez redirect dis");
					context.getExternalContext().redirect(viewUrl);
					return;
				}
				else if(!((Boolean)sessao.getAttribute("autenticacao")).booleanValue())
				{
					System.out.println("fez redirect 2");
					context.getExternalContext().redirect(viewUrl);
					return;
				}
			}
		}catch(IOException i){
			i.printStackTrace();
			return;
		}
		
		if (con == null) {
			try {
				Class.forName("com.mysql.jdbc.Driver");
				con = DriverManager
						.getConnection("jdbc:mysql://localhost/jsf_testes", "root", "flutopo");
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

não sei se entendi direito…

voce quer que execute sempre algo quando o usuário tenta logar?

se vc colocar este bean como escopo de request resolve?
a cada requisição o faces cria uma nova instância dele.

mas se nao for isso vc pode usar um recurso chamado filter.
fica configurado no web.xml. Este filter é uma classe que é executada sempre quando se acessa um path.

[]´s
Dartanghan

tu ta usando a abordagem errada …
tem que trabalhar usando os recursos do framework …

crie um managed bean escopo request
outro no escopo session

e uma propriedade gerenciada no de escopo request que aponta para o de escopo session
no de escopo session tu guarda as informações de autenticação

e o código para isto não deve estar no construtor de classe nenhuma, e sim em um método action

Urubatan

Voce poderia postar como ficaria um faces-config com essa configuração?

Dartanhan,

Eu havia pensado em utilizar um filter, mas acreditava que a framework provesse algo do tipo (como citado pelo urubatan). Não conheço os escopos dos beans (request e sessão), ainda tenho que dar uma olhada melhor nisso.

Urubatan,

Sua solução parece bacana, mas algumas coisas que você citou nela eu ainda não consegui entender direito (não conheço tão bem JSF), pode me responder mais alguns itens??

Vc disse o seguinte:

Tem como passar um exemplo dessa configuração (trexo do xml)?

[quote] e o código para isto não deve estar no construtor de classe nenhuma, e sim em um método action
[/quote]

Método action é um método qualquer da classe ou um método específico??

Vou continuar pesquisando, mas se puderem me adiantar as informações acima eu agradeço.

faz o seguinte:
da uma olhada no meu blog (http://blog.urubatan.com.br)
clica no link de “palestras, artigos e exemplos”, no menu esquerdo.
e baixa o exemplo da palestra do WebDays.

e por enquanto te preocupa só com o faces-config.xml que tem la, não esquema muito a cabeça com o resto pra não confundir de cara :smiley:

Seu arquivo zip, que tu indicou, esta corrompido urubatan.
:?