Sistema de login para web! Como seria a estrutura?

7 respostas
alexandref93

Minha dúvida, é que até agora não descobri um jeito de fazer um sistema de autenticação, tipo tem lá uma página de login e tenho um outra página que seria a principal, mas por exemplo não adianta apenas passar pela página de login, se você souber o link da página principal, é só acessar e pronto, como eu faria para que quando fosse para a página principal e não estiver logado, o site pede a senha, e se sair da conta não deixa mas mexer em nada do site, deu pra entender a dúvida??? Eu não faço a mínima idéia de como seria, ou se tem algum conceito ou arquitetura!

Obrigado desde já!

7 Respostas

C

Tem um tutorial que gosto muito que vai bem além do que você precisa, dá uma estudada em http://jamacedo.com/2011/01/crud-jsf-2-parte-3-seguna-com-spring-security-3/

luxu

eu uso no meu projeto o Phase Listener q recebe toda requisição antes de acessar a um determinado local, ou seja, se naum estiver logado retorna pra página de login, veja:

Faces-config.xml

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
 <lifecycle>
  <phase-listener>br.com.luxu.controller.ListenerFasesJSF</phase-listener>
 </lifecycle>
</faces-config>

ListenerFasesJSF.java

package br.com.luxu.controller;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import org.hibernate.Session;

import br.com.luxu.util.FacesContextUtil;
import br.com.luxu.util.HibernateUtil;

public class ListenerFasesJSF implements PhaseListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public void beforePhase(PhaseEvent fase) {
		System.out.println("Antes Fase: " + fase.getPhaseId());
	
		if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
			LoginBean loginBean = (LoginBean)FacesContextUtil.getSessionAttribute("loginBean");
			if(loginBean == null || !loginBean.getAutenticado()){
				FacesContextUtil.setNavegacao("login");
			}
		}
		
		if (fase.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
			Session session = HibernateUtil.getSessionFactory().openSession();
			session.beginTransaction();
			FacesContextUtil.setRequestSession(session);
		}

	}

	@Override
	public void afterPhase(PhaseEvent fase) {
		
		System.out.println("Depois Fase: " + fase.getPhaseId());
		
		if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
			Session session = FacesContextUtil.getRequestSession();
			try {
				session.getTransaction().commit();
			} catch (Exception e)
			{
				System.out.println("Erro no commit da transacao");
				System.out.println(e.getMessage());

				if (session.getTransaction().isActive())
				{
					session.getTransaction().rollback();
				}
			} finally 
			{
				session.close();
			}
		}
	}

	@Override
	public PhaseId getPhaseId() {
		return PhaseId.ANY_PHASE;
	}
}

Managed Bean do login

package br.com.luxu.controller;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import br.com.luxu.DAO.HibernateDAO;
import br.com.luxu.DAO.InterfaceDAO;
import br.com.luxu.classe.Usuario;
import br.com.luxu.util.FacesContextUtil;

@ManagedBean
@SessionScoped
public class LoginBean {
	
	private Usuario usuario = new Usuario();
	private Boolean autenticado = false;

	public String verificarLogin() {
		InterfaceDAO<Usuario> usuDAO = new HibernateDAO<Usuario>(Usuario.class,FacesContextUtil.getRequestSession());
		Usuario usuAux = new Usuario();
		usuAux.setLogin(usuario.getLogin());
		List<Usuario> listaUsuarios = usuDAO.getBeansByExample(usuAux);
		if (listaUsuarios != null && listaUsuarios.size() > 0) {
			usuAux = listaUsuarios.get(0);
			if (usuario.getSenha() != null && usuario.getSenha().equals(usuAux.getSenha())) {
				autenticado = true;
				usuario = usuAux;
				return "/formularios/principal";
			}
		}
		FacesContext c = FacesContext.getCurrentInstance();
		FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro","Usuario/Senha incorretos");
		c.addMessage(null, m);
		return null;
	}

	public String efetuaLogoff() {
		limpar();
		return "/formularios/index";
	}

	public void limpar() {
		usuario = new Usuario();
		autenticado = false;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public Boolean getAutenticado() {
		return autenticado;
	}
}

Lembrando uso JSF2.0+Eclipse

DZR

Uma maneira simples é, ao logar, jogar os dados do usuário logado na sessão (por segurança, não jogue a senha do usuário na sessão…).
Depois de ter os dados na sessão, verifique em casa página se há algum dado na sessão no qual mostre o usuário autenticado, ou seja, busque por exempo o nome do usuário na sessão. Se for diferente de NULL, o usuário está autenticado e pode acessar a página. Se não, redirecione-o a uma página de erro.

FernandoFranzini

Existem varias maneiras diferentes e bacanas de fazer isso.
Segue algumas dicas - http://fernandofranzini.wordpress.com/2009/09/09/autenticacao-e-autorizacao/
Pare para ler, vejas o exemplos, entende seu contexto e escolha o mais adequado.
Precisando de algo estamos por aqui.
T+

P

Usando Filtros vc consegue fazer isso que vc quer. Não sei se esta usando frameworks, mas no caso de jsp/servlets vc mapearia o servlet ou a url desejada no web.xml e criaria uma classe Filtro que implementaria a interface Filter, nesta classe vc poderia verificar se os dados do usuario estão corretos e chamar chain.doFilter(request, response); que libera o acesso a pagina desejada.

A informação ta ai agora é so pesquisar xD

FernandoFranzini

Sim pedro.
Resumidamente, em aplicações web Java o ponto centro de autenticação e autorização é o servlet filters. Mas existem outras opções tb como:

alexandref93

Putz… com todo conteúdo que responderam aqui, já vai ajudar muito, vou dá uma lida em tudo!

Obrigado a todos!

Criado 15 de agosto de 2011
Ultima resposta 16 de ago. de 2011
Respostas 7
Participantes 6