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 :?:
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.
É 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 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:
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.
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…
[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.
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)
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)
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) .