Redirecionando para Tela de Login, caso não estiver logado, Alguem já fez?

Pessoal estou com uma dúvida que na verdade nunca tentei.
Uso o JSF sem o jboss seam. e quero fazer um Redirect da tela de Login para a Tela que tentei antes Acessar mas não tinha logado antes, ou seja ,

Quando você tenta acessar a página “ListarClientes.jsf” mas não está logado, a Aplicação redireciona para a Tela de Login…
e depois feito o Login ele redireciona para a página que você estava tentando “ListarClientes.jsf”.

Por exemplo:
No jboss seam basta colocar na página MyPage.pages.xml o login-required = true que isso funciona, mas e no JSF puro?

NO JbossSeam

[code]
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.2.xsd
login-required=“true” >

[quote]

:wink:

Eu fiz usando o Spring sem JSF, mas a idéia é basicamente a mesma.
Fiz um filtro que controla se o usuário está logado ou não.
Este filtro pega a URL que o usuário digitou, redireciona o usuário para a tela de login e passa a página como um parâmetro para a tela de login.
Na página de login, uso um input hidden que recebe o parâmetro e o deixa no form.
Na action de login, recebo o parâmetro e se ele existir - implicando que o usuário estava tentando entrar em outra página que não a home - então redireciono ele para página que ele queria ir. Senão, mando ele para a home mesmo.

Por um acaso esse Filtro é uma Classe que extends a Filter e fica no Listener no seu web.xml ?

Pior que meu form utiliza JAAS

Não sei como irei fazer rsrs

Mas obrigado pela idéia

Não conheço muito JAAS, já li alguns artigos e vi algumas implementações.
Achei este artigo aqui no GUJ: http://www.guj.com.br/articles/184
Mas não sei se tem como você fazer isso porque o JAAS tem sua própria action de login e provavelmente vai redirecionar o usuário sem repassar nenhum parâmetro recebido. Posso estar falando bobagem, talvez alguém que tenha mais experiência com JAAS possa ver alguma solução.

Use o PhaseListener.

Dá uma olhada nesses links:

:arrow: http://www.guj.com.br/java/121134-jsf-com-controle-de-acesso-phase-listener

:arrow: http://www.guj.com.br/java/198920-controle-de-acesso-a-componentes-jsf-com-phase-listener

Valeu Galera ! eu pra resolver o problema estou usando o JAAS no tomcat 7

Aproveitando vou deixar aqui o Exemplo que o Autenticador peguei do próprio GUJ

Tutorial:
http://www.guj.com.br/articles/184

em Anexo contém o .jar (jaasGuj.jar) que já está o Tutorial do link acima já compilado, e só basta você copiar e colar no diretório
Tomcat7/lib/

2º Passo
No diretório
apache-tomcat-7\conf crie um arquivo chamado jaas.config
e nele contém o conteudo:

myApp_login { br.com.infocontas.security.GujLoginModule required dataSourceName="jdbc/myDataSource" sqlUser="select password from users where user_name=?" sqlRoles="select role_name from user_role where user_name=?"; };

3º Passo
No apache-tomcat-7\bin\catalina.bat
procure a variavel de ambiente set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%
Abaixo dela acrecente seu jaas.config

Depois no Server.xml ( apache-tomcat-7\conf ) insira seu context dentro da Tag conforme o exemplo abaixo:

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
<Context path="/myApp docBase="myApp"
				debug="1" reloadable="true" crossContext="true">
<Realm className="org.apache.catalina.realm.JAASRealm"
					 appName="myApp_login" 
					 userClassNames="br.com.infocontas.security.principals.User" 
					 roleClassNames="br.com.infocontas.security.principals.Role" 
					 />
</Context>
</Host>

4º Passo

Criaremos a tela de login.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
</head>
</body>
<form id="formLista" action="#{request.contextPath}/j_security_check" method="post">
<table cellspacing="5">
	<tr>
		<td>Login:</td>
		<td><input type="text" name="j_username" /> </td>
	</tr>
	<tr>
		<td>Senha:</td>
		<td><input type="password"  name="j_password" /></td>
	</tr>
	<tr>
	        <td colspan="2">
			 <input type="submit" value="Entrar"/>
                 </td>
	</tr>
</table>
</form>
</body>
</html>

5º Passo ( último)
Vamos configurar o no web.xml de sua aplicação

   <welcome-file-list>
    <welcome-file>index.jsf</welcome-file>
  </welcome-file-list>
<security-constraint>
    <display-name>Página index protegida</display-name>
    <web-resource-collection>
      <web-resource-name>Protected Area</web-resource-name>
      <url-pattern>/index.jsf</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>ADM</role-name>
    </auth-constraint>
  </security-constraint> 
  <security-role>
      <description>ADM</description>
    <role-name>ADM</role-name>
  </security-role> 

  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>ADM</realm-name>
    <form-login-config>
      <form-login-page>/login.jsf</form-login-page>
      <form-error-page>/error.jsf</form-error-page>
    </form-login-config>
  </login-config>

FIM seu JAAS está configurado!

No exemplo acima, ao ser redirecionao para a página index.jsf sem estar logado
http://localhost:8080/myApp/
Você será redirecionado para a pela de login.jsf

Ao logar, você será redirecionado para o index.jsf ( página destino ) isso se tiver a permissão ADM em seu banco conforme
a query no arquivo [b]jaas.login /b

Agora para controlar a sessão se expirou ou não daí seria recomendável eu usar o Phase-Listener para isso ?

abrs a todos espero ter ajudado !

jhieiy primeiramente gostaria de agradecer pelo ótimo material postado, pois eu estava utilizando o mesmo tutorial mas não estava sabendo cmo definir algumas coisas.

Mas agora fikei com uma dúvida em relação ao parametro do datasource, eu mandei executar o projeto esta dando um erro de:
javax.security.auth.login.LoginException: Erro ao recuperar DataSource: javax.naming.NameNotFoundException: Name [jdbc/myDataSource] is not bound in this Context. Unable to find [jdbc].
Não esta faltando nda no server.xml?