Pessoal, estou com um projeto em JSF e fiz uma página de login e senha com validação no banco, criptografia e tudo mais.
Preciso agora criar uma sessão para que o usuário possa realizar as operações dentro do sistema web. E quero bloquear caso ele não tenha permissão ou fique inativo por por exemplo 5 minutos (isso eu sei que dá pra configurar no web.xml).
Não tenho muita idéia de como fazer isso… Tem gente que usa Filter, outros usam Servlet mas não sei se seria o certo no JSF… Alguém pode me dar uma luz?
packagecom.estagio.controller;importcom.estagio.business.UsuarioBO;importcom.estagio.entidade.Usuario;importjava.io.IOException;importjavax.annotation.PostConstruct;importjavax.faces.application.FacesMessage;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.SessionScoped;importjavax.faces.context.FacesContext;/** * @author Cristian Urbainski * @since 01/05/2012 */@ManagedBean@SessionScopedpublicclassUsuarioLogadoController{privateUsuariouser;privateBooleanusuarioLogado;privatestaticUsuarioLogadoControllerinstance;@PostConstructpublicvoidinicializa(){user=newUsuario();usuarioLogado=Boolean.FALSE;instance=this;}publicstaticUsuarioLogadoControllergetInstance()throwsException{if(instance==null){thrownewException("Não há usuario logado no sistema, Oh my god!");}returninstance;}publicvoidlogout(){this.user=null;FacesContext.getCurrentInstance().getExternalContext().invalidateSession();}publicvoidfazerLogin(){try{Usuariou=newUsuarioBO().efetuarLogin(user);if(u==null){FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_ERROR,"Erro","Usuario não encontrado ou senha incorreta, tente novamente."));}else{usuarioLogado=Boolean.TRUE;user=u;}}catch(Exceptione){FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_ERROR,"Erro","Erro ao efetuar login, tente novamente."));}}publicStringgetNomeUsuario()throwsIOException{if(usuarioLogado){returnuser.getFuncionario().getNmFuncionario();}FacesContext.getCurrentInstance().getExternalContext().redirect("/projetoEstagio/faces/paginas/login.xhtml");return"";}publicUsuariogetUser(){returnuser;}publicvoidsetUser(Usuariouser){this.user=user;}}
quando o sistema é aberto eu vejo se existe usuario logado se existir exibo o index mas se naum existir redireciono a pagina para o login, a pagina efetuar login chama esse metodo efetuarLogin
G
gabriel.amoedo
Peraí, deixa eu ver se entendi.
Eu não preciso instanciar nenhum HttpSession por exemplo?
Pq eu sei que pra você fechar uma sessão, vc precisar dar um invalidate()… E vc faz isso no:
Então eu preciso/devo usar a instância do FacesContext pra fazer essas manipulações de sessão? Não precisa de servlet ou filter ou qualquer coisa do tipo?
gabrielfrios
Manolo, utilize o Filter to JSF. Cria um para controle de usuários.
CristianPalmaSola10
Voce pode fazer por meio de filtro ou servlet, so que eu penso assim, se fazer com servlet ou filtro é necessário fazer configurações em arquivos .xml, para ser exato no web.xml e eu procuro evitar isso, porque se voce pode ter feito tudo certo e so esqueceu da configuração no xml o troço naum funciona, eu ja vi muito colega meu se quebrando por esquecer esse tipo de coisa, ai voce acaba naum sendo programador e sim configurador de coisas, por isso eu costumo fazer desse jeito para fugir do xml, alguns vao dizer que estou errado e outros podem concordar comigo, eu faço assim por julgar que assim é melhor, vc tem que ver o que acha melhor e implementar como voce achar melhor.
FacesContext por baixo dos panos deve manipular a HttpSession, naum tenho certeza, posso estar errado mas acho que é isso que ele faz.
CristianPalmaSola10
Aqui tem um exemplo do login com filtro
packagecontrole;importjavax.faces.application.FacesMessage;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.RequestScoped;importjavax.faces.context.FacesContext;importjavax.servlet.http.HttpSession;importmodelo.dao.HibernateUtil;importmodelo.dao.UsuarioDao;importmodelo.entidade.Usuario;importorg.hibernate.Session;/** * @author lucas */@ManagedBean@RequestScopedpublicclassLoginHandler{UsuariousuarioLogado;publicLoginHandler(){usuarioLogado=newUsuario();}publicUsuariogetUsuarioLogado(){returnusuarioLogado;}publicvoidsetUsuarioLogado(UsuariousuarioLogado){this.usuarioLogado=usuarioLogado;}publicStringlogin(){StringirPara="login";Sessions=HibernateUtil.currentSession();UsuarioDaodao=newUsuarioDao(s);FacesContextfacesContext=FacesContext.getCurrentInstance();UsuariousuarioNoBD=dao.localizeUsuarioPorNome(usuarioLogado.getUsername());if(usuarioNoBD==null){facesContext.addMessage("erro",newFacesMessage("Login não autorizado! Usuário não cadastrado."));usuarioLogado=newUsuario();}elseif(!usuarioNoBD.getPassword().equals(usuarioLogado.getPassword())){facesContext.addMessage("erro",newFacesMessage("Login não autorizado! Senha incorreta"));usuarioLogado=newUsuario();}else{HttpSessionsessaoHttp=(HttpSession)facesContext.getExternalContext().getSession(true);sessaoHttp.setAttribute("usuarioLogado",usuarioLogado);irPara="index";}returnirPara;}publicStringlogout(){usuarioLogado=null;return"login";}}
packagecontrole;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importmodelo.entidade.Usuario;publicclassLoginFilterimplementsFilter{privatefinalstaticStringFILTER_APPLIED="_security_filter_applied";publicLoginFilter(){}@Overridepublicvoidinit(FilterConfigarg0)throwsServletException{}@Overridepublicvoiddestroy(){}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequesthreq=(HttpServletRequest)request;HttpServletResponsehresp=(HttpServletResponse)response;HttpSessionsession=hreq.getSession();hreq.getPathInfo();StringpaginaAtual=newString(hreq.getRequestURL());System.out.println(">>>>>>>"+paginaAtual);if((request.getAttribute(FILTER_APPLIED)==null)&&paginaAtual!=null&&(!paginaAtual.endsWith("login.xhtml"))&&(paginaAtual.endsWith(".xhtml"))){request.setAttribute(FILTER_APPLIED,Boolean.TRUE);Stringuser=null;if(((Usuario)session.getAttribute("usuarioLogado"))!=null){user=((Usuario)session.getAttribute("usuarioLogado")).getUsername();}if((user==null)||(user.equals(""))){hresp.sendRedirect("login.xhtml");return;}System.out.println(">>>>>> "+user);}// entrega a requisição para o proximo filtro chain.doFilter(request,response);}}
E se o usuário tentar acessar suas paginas digitando na url? Esse seu Controller cuida disso?
Dificilmente vc vai ficar longe de XML ainda mais em aplicações EE. Configuração em XML não funciona? Não é vc que não esta conseguindo configurar? E quem disse que programador não configura XML?
CristianPalmaSola10
Sim, no cabeçalho da pagina eu exibo o nome do usuario logado, se ele tentar acessar pela url o banner vai tentar pegar o nome do usuario logado vai ver que não ha usuario logado e vai redireciona-lo para o login
se voce reparar no post anterior aonde post as classes inteiras esse metodo esta na classe UsuarioLogadoController.java
CristianPalmaSola10
Cada um tem um jeito de fazer para decidir fazer como faço eu fiz desse jeito e com xml decidi fazer assim por ser mais facil, so isso cada um gosta de fazer a uma coisa de um jeito, é escolha propria so isso
Rodrigo_Sasaki
Só uma dúvida mesmo, se eu souber o nome de um usuário logado, eu consigo invadir seu sistema ?
gabrielfrios
E onde vc está invalidando a sessão?
Não estou criticando a sua solução, só a sua forma de pensar, de que XML é um problema. Só estou dizendo que trabalhando com JavaEE vc não tem como fugir do XML.
XML funciona muito bem.
CristianPalmaSola10
digaoneves: acredito que não, de uma olhada na classe que esta um pouco pra cima nos post UsuarioLogadoController, ela é um ManagedBean de Scopo de Sessao eu acredito que naum tem como voce burlar ela, o que voce me diz? ha como fazer isso ?
Isso é uma questão a ser testada poder ser o ponto falho da minha solução, eu acredito que não há como faze-lo.
gabrielfrios: repare na classe UsuarioLogadoController que postei anteriormente ela possui um metodo que invalida a sessao, vou posta-lo novamente, so peco que olhe melhor o codigo que eu postar antes de sair perguntando aonde faço as coisa, naum leve a mal, mas estava embaixo do seu nariz
Concordo, não como fugir do xml, hibernate, e tals mas gosto de evita-lo um pouco so isso.
gabrielfrios
Manolo, não precisa ficar bravo não, como disse anteriormente não estou criticando a sua implementação. O que eu disse é que você não pode criticar uma tecnologia por não saber usa-la.
Cara, so naum gosto que fiquei me pedindo coisa que estao debaixo do nariz das pessoas e elas naum vem isso realmente me deixa irritado, e a parte sobre " O que eu disse é que você não pode criticar uma tecnologia por não saber usa-la." concordo com voce, mas eu disse o que disse porque conheco os dois jeitos se voce naum reparou eu postei a mesma solucao usando filtro, mas uma vez sua desatenção esta evidente.
gabrielfrios
Dizer que você não sabe utilizar a tecnologia não foi baseada na implementação do filtro que você postou, pois um código desse você consegue na primeira pagina do google. Disse isso pelo fato de você dizer que não funciona e não demonstrar fatos que comprovem a sua afirmação.
CristianPalmaSola10
da e dai ?
CristianPalmaSola10
voce diz fazer algo assim, como fiz nesta outra aplicação
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:security="http://www.springframework.org/schema/security"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"><security:httpauto-config="true"use-expressions="true"><security:intercept-urlpattern="/css/*"access="hasAnyRole('ROLE_ANONYMOUS','Administrador','Master','Padrão')"/><security:intercept-urlpattern="/img/*"access="hasAnyRole('ROLE_ANONYMOUS','Administrador','Master','Padrão')"/><security:intercept-urlpattern="/history/*"access="hasAnyRole('ROLE_ANONYMOUS','Administrador','Master','Padrão')"/><security:intercept-urlpattern="/js/*"access="hasAnyRole('ROLE_ANONYMOUS','Administrador','Master','Padrão')"/><security:intercept-urlpattern="/services/*"access="hasAnyRole('ROLE_ANONYMOUS','Administrador','Master','Padrão')"/><security:intercept-urlpattern="/login.html"access="hasAnyRole('ROLE_ANONYMOUS','Administrador','Master','Padrão')"/><security:intercept-urlpattern="/**"access="hasAnyRole('Administrador','Master','Padrão')"/><security:form-loginlogin-processing-url="/j_spring_security_check"login-page="/login.html"default-target-url="/index.html"authentication-failure-url="/login.html?login_error=1"/><security:logoutlogout-url="/j_spring_security_logout"logout-success-url="/login.html"/></security:http><security:global-method-securitysecured-annotations="enabled"/><security:authentication-manager><security:authentication-provider><security:password-encoderhash="md5"/><security:jdbc-user-servicedata-source-ref="dataSource"users-by-username-query="select ds_login as username, ds_senha as password, tp_situacao as enabled from usuario where ds_login = ?"authorities-by-username-query="select us.ds_login as username, ds_papel as authority from usuario us, permissao pe, papel pa where us.id_usuario = pe.id_usuario and pe.id_papel = pa.id_papel and us.ds_login = ?"/></security:authentication-provider></security:authentication-manager><beanid="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean"><propertyname="jndiName"value="java:comp/env/jdbc/slu"/><propertyname="resourceRef"value="true"/></bean></beans>
usando jaas que é muito bom para isso
CristianPalmaSola10
Nunca falei que não funciona, disse que acho mais ruim de usar por ter que configurar xml, naum coloque palavras em minha boca, seu imbecil. Ta sem argumento, ou o que eu uso assim porque quero use do jeito que vc quiser seu idiota, so apresentei a minha solucao se naum gosta do nem ai pra vc,
gabrielfrios
Suas palavras.
Mano não vou mais discutir com você. Já perdeu a linha e está tentando me agredir verbalmente. O tópico já está apto a ser bloqueado por sua causa. Quando você souber entrar em uma discussão como homem voltamos a conversar.
CristianPalmaSola10
Mas claro se voce criar as classes e esquecer de por no web.xml o mapeamento do filtro ai naum funciona mesmo e se vc naum sabia disso e vc que estava falando merda sem conhecer nada, faca um teste espertao, mas se voce for um cara esperto e naum esquecer de nada claro que o troco funcioma esprtao
CristianPalmaSola10
…
Hebert_Coelho
gabriel.amoedo:
Pessoal, estou com um projeto em JSF e fiz uma página de login e senha com validação no banco, criptografia e tudo mais.
Preciso agora criar uma sessão para que o usuário possa realizar as operações dentro do sistema web. E quero bloquear caso ele não tenha permissão ou fique inativo por por exemplo 5 minutos (isso eu sei que dá pra configurar no web.xml).
Não tenho muita idéia de como fazer isso… Tem gente que usa Filter, outros usam Servlet mas não sei se seria o certo no JSF… Alguém pode me dar uma luz?
Cara, vou esquivar do tiroteio que tá rolando e vou responder aqui numa boa. [=
Eu ouvi por aí (mas não posso confirmar tecnicamente) que O SpringSecurity não funciona como JSF, MAS não tenho como confirmar.
Espero que os links acima possa te ajudar, qualquer dúvida basta colocar.
gabrielfrios
Funciona sim jakefrog. Já trabalhei em um projeto JSF + Spring Security.
Hebert_Coelho
gabrielfrios:
Funciona sim jakefrog. Já trabalhei em um projeto JSF + Spring Security.
Uia! Legal.
Eu ouvi alguém aqui no forum dizer que ñ funcionava. Por isso fico pé atrás.
Ainda preciso aprender com qual botão que atira no Spring. [=
Valeu pela informação. =D
G
gabriel.amoedo
Opaa obrigado…
Estou aqui tentando desenvolver desde aquela hora com Filter mesmo…
Vou começar a testar aqui e ver funcionando…
Acho que o problema maior é quando você não entende muito bem o que está fazendo.
Apesar de saber o que precisa ser feito, de utilizar Session e colocar controle e segurança de acesso, eu não entendo tão bem assim como funciona essa questão do Session.
Hebert_Coelho
gabriel.amoedo:
Opaa obrigado…
Estou aqui tentando desenvolver desde aquela hora com Filter mesmo…
Vou começar a testar aqui e ver funcionando…
Acho que o problema maior é quando você não entende muito bem o que está fazendo.
Apesar de saber o que precisa ser feito, de utilizar Session e colocar controle e segurança de acesso, eu não entendo tão bem assim como funciona essa questão do Session.
Essa abordagem do Filter eu sei que é muito utilizada e segura. Caso outra pessoa precise procurar por um esquema de login na sua aplicação, lá no web.xml será o primeiro lugar a ser vasculhado.
A abordagem do Session eu nunca vi do modo como está sendo utilizado, e não consigo avaliar sua efetividade do modo como foi exposta. É questão de gosto e deve ser respeitado. [=
G
gabriel.amoedo
Sim rs…
Mas eu estava vendo a melhor forma de implementar a parte de login de um sistema já que nunca tinha feito isso.
Quando falei do Session é porque fazia esse controle através de um servlet mas era JSP puro rs…
Já pelo JSF, falaram que o ideal era o Filter junto com o Spring ou o Filter sozinho mesmo. Cheguei até a olhar ontem esses exemplos com JAAS que vc acabou de postar…