JSF login e jogar na SESSÃO

Pessoal eu estava com dúvida em sessão num topico anterior que um usuário me esclareceu algumas coisas legais…

minha dúvida é:
se eu colocar um bean como session, verificar o login e senha corretos, já estaria certo ou não…

assim, tela login:

<inputText: value="#{Bean.user}"/>
<inputPassword value ="#{Bean.senha}"/>
<h:commandButton action="#{Bean.validaLogin}"/>

no meu backing bean:

public class Bean{
  private Usuario usuario;

 public String validaLogin(String nome, String senha) {
   //aqui comparo se existe no banco ... se valores não foi null e etc..
   
   if(tudo certo) {
   return "ok"; // aqui me manda pra pagina logado.jsp
   } else 
   return "null";  // aqui fico na mesma pagina e exibe erro.
 }
}

minha dúvida é: pelo que me esclareceram, devo colocar o bean usuario na sessão dentro de um Backing bean de sessão e não colocá-lo diretamente na sessão, mas desta maneira acima já não estaria na sessão…ao chamar o metodo validaLogin, ele já jogaria o usuario na sessao…mesmo que nao seja validado…

dei uma procurada na net e não achei um login que me esclareça isso, no blog do urubatan tem um mas não aborda isso…

se alguém puder esclarecer, minha dúvida é: como JOGAR o usuario na sessão depois de verificar que o login está ok…

o que eu preciso fazer acima pra que isso aconteça :?:

Olá JavaTux.

O usuário já se encontra na sessão, entretanto, você pode deixa-lo como null e após o usuário entrar com os dados corretamente, você dá um new e seta seus atributos. Nas páginas que você quiser verificar se o usuário já se logou, uma idéia é usar um Filter (que verificaria se o atributo usuario dentro do seu managed bean eh == null) para efetuar tal validação.
Existem muitas maneiras de criar um sistema de login e dependendo do tamanho do seu aplicativo, ferramentas como ACEGI poderiam ajudar.

Fica aí a sugestão.

Boa sorte.

Você pode jogar o objeto usuario na sessão e recuperá-lo sempre que precisar.

Para setar:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario", objeto_usuario);

Para recuperar:

usuario = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

É interessante jogar o objeto usuário na sessão para vc testar em outras páginas.
Por exemplo se o usuário digitar uma url direta sem passar pelo login. Na abertura dessa página
vc verifica se tem um usuário na sessão, se não existe vc manda de volta para tela de login.
Para implementar essa lógica o interessante é criar um servelet que trabalha como filtro, monitorando todas as url’s acessadas.

Dê uma pesquisada em criar Servlet filtro jsp.

Beleza pessoal,

Dá uma olhada neste pedaço de um artigo de cinco partes, que possui Servlet Filter. Cara, é o que precisa para implementar um sistema de login e senha:

http://www.linhadecodigo.com.br/Artigo.aspx?id=1435

Abraços e bons códigos ai!

caro maurenginaldo valeu pela ajuda…

mas eu colocando no faces-config e dizendo ser do tipo SESSION já nao evitaria eu ter que fazer isso :?: eu são coisas independentes :?:

obrigado pelo esclarecimento

[quote=JavaTux]caro maurenginaldo valeu pela ajuda…

mas eu colocando no faces-config e dizendo ser do tipo SESSION já nao evitaria eu ter que fazer isso :?: eu são coisas independentes :?:

obrigado pelo esclarecimento[/quote]

Vai por mim, e outros do fórum, numa pesquisa pode confirmar: Servlet Filter. Cara, é suuuuuuuuuper mais simples, acredite.

Abraços

Na minha opinião, ao menos que seja totalmente necessário, você não deve acessar a session diretamente em seu managed bean. Através de um Filter é possível você acessar seu managed bean e por consequência seus atributos. Além de poder reutiliza-lo para todas as páginas que você necessitar de validação. Não utilizar o Filter implica em replicar a validação em seu construtor ou em um metodo anotado por @PostConstruct. Detalhe que não funcionaria corretamente para managed bean com scope session.

ok…valeu a todos…estou quase no final de incomodar vcs :smiley:

então vamos dizer eu usando um filter eu posso setar ele assim como disseram:

  FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario", AQUI_USUARIO);  

então esse AQUI_USUARIO, poderia ser uma classe normal, um simples pojo…

eu teria que obrigatoriamente TER / OU NÃO TER declarado ele no faces-config…

desculpe dúvidas bestas, mas eh que sou novo no jsf…

[quote] então esse AQUI_USUARIO, poderia ser uma classe normal, um simples pojo…

eu teria que obrigatoriamente TER / OU NÃO TER declarado ele no faces-config… [/quote]

Sim pode ser um pojo, pode ser qualquer objeto java.
E vc não precisa declarar nada no faces-config.

pessoal mas usando FILTER eu conseguirei restringir um acesso a diretorio ? com base em usuarios e perfis?

Através do FILTER vc consegue controlar toda a navegação de sua aplicação.

Galera sou novato no JSF e no JAVa, e gostaria de entender melhor esse lance de filtro, alguem pode me indicar onde consigo um exemplo ou alguem pode mostrar…

Abraços

[quote=guigoerlmartin]Galera sou novato no JSF e no JAVa, e gostaria de entender melhor esse lance de filtro, alguem pode me indicar onde consigo um exemplo ou alguem pode mostrar…

Abraços[/quote]

Pesquisa no fórum que no mínimo, uns 10 você encontra. Filtros não são só para JSF, então, vai ter muito mais.

Abraços

Não sei por que mas quando eu jogo um obj Usuario na seção da nullPoint alguem pode me dar uma dica?

Meu Codigo:

O erro:

 if (session.getAttribute("usuarioLogado") == null) {

			String loginUser = request.getRemoteUser();
			Usuario user = null;

			EntityManager manager2 = Persistence.createEntityManagerFactory(entidade).createEntityManager();

			//Query q = manager.createQuery("from Produto p");
			// sessao user
			Query use = manager2.createQuery("from Usuario u where u.login = :login");
			use.setParameter("login", loginUser);

			user = (Usuario) use.getSingleResult();

			session.setAttribute("UsuarioLogado", user);
			
			//Usuario usuarioAux = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado"); 
			
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuarioLogado", user); 

		}
		

java.lang.NullPointerException
	at Util.UsuarioFilter2.doFilter(UsuarioFilter2.java:101)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493)
	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.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
	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)

Obrigado!

Eu tenho um exemplo de login usando Query do Hibernate.

Fiz o seguinte:

Classe UserDao

public User login(String user, String senha) {
   User retorno;
   String sql = "from User where user = :user and senha = :senha";
   
   Query q = this.session.createQuery(sql);
   q.setString("user", user);
   q.setString("senha", senha);
   retorno = (User) q.uniqueResult();

   return retorno;

Classe Login

		new HibernateUtil();
		new CriptoMd5(); /* É uma classe do meu projeto para usar criptografia MD5, retorna String */
		User usuario = new User();
		usuario.setUser(req.getParameter("user"));
		usuario.setSenha(CriptoMd5.generate(req.getParameter("senha")));

		Session session = HibernateUtil.getSession();
		UserDao userDao = new UserDao(session);
		User retorno = userDao.login(usuario.getUser(), usuario.getSenha()); /* Isso poderia ter sido jogado logo o req.getParameter();, mas tudo bem */

		try {
			if (!retorno.equals(null)) {
				req.getSession().setAttribute("login", retorno);
				resp.sendRedirect("sis/index.jsp");
			}
		} catch (NullPointerException e) {
			resp.sendRedirect("index.jsp");
		}
	}

Se você reparar na minha classe Dao eu faço com que ele faça a busca e retorne um único User.
Primeiro, na minha entidade o usuário é único, não pode existir dois usuários com o mesmo nome de acesso (login).
Segundo, na minha classe UserDao passo por parametro ao meu método login os valores do input e busco o usuário como você fez.
Terceiro, na minha classe Login, verifico o retorno do método login de UserDao e trato o mesmo, quando é retornado NULL, ele joga esta Exception: NullPointerException, isso vai informar que ele não achou nada no banco, então eu redireciono meu cliente para a página atual que ele está (a tela de login) :slight_smile:

Espero ter ajudo, porém minha aplicação não está com JSF.

try { if (!retorno.equals(null)) { req.getSession().setAttribute("login", retorno); resp.sendRedirect("sis/index.jsp"); } } catch (NullPointerException e) { resp.sendRedirect("index.jsp"); }
Este tratamento está errado. Você está gerando a exceção à toa; ela é gerada porque retorno está null e você tenta acessar o equals() dele. Tire o try/catch e deixe só if/else, com if (retorno != null) .

Obrigado Deu para entender melhor como isso funciona…

Valeu mesmo!

É vero. Valeu.