Autenticação e autorização de usuários

7 respostas
D

Pessoal

Estou fazendo uma aplicação WEB e preciso fazer autenticação de usuários (somente usuários com login e senha válidos poderão acessar) e autorização dos mesmos (de acordo com a regra do usuário, ele terá acesso a determinadas áreas do sistema) e estes usuários devem estar cadastrados num banco de dados, pois haverá no sistema um módulo para gerenciamento dos mesmos.

Qual é a melhor maneira de fazer isto?

Obrigado

7 Respostas

A

Dê uma olhada em http://jguard.net

Abraço,

T

Também leia sobre Spring Security, nunca usei(ainda) mas vale a pena ao menos dar uma olhada.

W

mais um.

Tutorial de JAAS

Y

Você também pode utilizar um Filter.
Com ele basta adicionar essa tag no web.xml:

<filter>
        <filter-name>Filtro Adm</filter-name>
        <filter-class>login.FiltroSessao</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Filtro Adm</filter-name>
        <url-pattern>/adm/*</url-pattern>
    </filter-mapping>

E criar a classe:

package login;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;



public class FiltroSessao implements Filter {

    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpSession session = ((HttpServletRequest) req).getSession();
        HttpServletRequest hreq = (HttpServletRequest) req;  
        
        String requestUri  = hreq.getRequestURI();  
        String contextPath = session.getServletContext().getContextPath();
        
        Login login = (Login) session.getAttribute("login");
        if (login != null) {
        	chain.doFilter(req, res);
        	if(requestUri.endsWith("/")) {
            	((HttpServletResponse) res).sendRedirect(contextPath + "/adm/index.jsp");
            }        	
        } else {
            ((HttpServletResponse) res).sendRedirect(contextPath + "/login.jsp");
        }
    }

    public void destroy() {

    }
}

Por último na sua classe de login:

//Caso os dados informados estejam corretos  você coloca o objeto com os dados do usuário na sessão
session.setAttribute("login", login);

Com esse método toda vez que o usuário tentar acessar uma página dentro da pasta setada no filtro o sistema irá executar o método doFilter.
Se o usuário estiver logado, ele permitirá o acesso, caso contrário ele será redirecionado para a página de login.

Obs. No seu login você terá que colocar o usuário na sessão.

[]´s

Daniel

T

A sim e se estiver usando JSF tbm pode utilizar m PhaseListener, uso aqui e funciona muito bem.

K
yorgan:
Você também pode utilizar um Filter. ...
Olá yorgan, td bem? Estou tentando fazer essa implementação de validação, mas fiquei em dúvida onde devo instanciar a "session.setAttribute("login", login);": Eu tenho a classe Login, que está assim:
package br.gov.rr.setrabes.estrutura;

public class Login {

	private String login;
	private String senha;
	private String nivel;

	public Login() {
	}

	public Login(String login, String senha, String nivel) {
		this.setLogin(login);
		this.setSenha(senha);
		this.setNivel(nivel);
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNivel() {
		return nivel;
	}

	public void setNivel(String nivel) {
		this.nivel = nivel;
	}

	public boolean isLogado() {
		// TODO Auto-generated method stub
		return false;
	}
}
Na classe LoginHandler, crio uma regra de acesso tipo usuário/administrador:
package br.gov.rr.setrabes.handler;

import java.security.NoSuchAlgorithmException;
import java.util.List;

import org.hibernate.Session;

import br.gov.rr.setrabes.dao.Dao;
import br.gov.rr.setrabes.dao.LoginDAO;
import br.gov.rr.setrabes.estrutura.Login;
import br.gov.rr.setrabes.estrutura.Usuario;
import br.gov.rr.setrabes.util.HibernateUtil;

public class LoginHandler {

	private LoginDAO loginDAO = new LoginDAO();
	private Login LO = new Login();
	private Boolean logado = new Boolean(false);

	public LoginHandler() {
	}

	public Boolean isLogado() {
		return this.logado;
	}

	public void setLogado(Boolean logado) {
		this.logado = logado;
	}

	public Login getLO() {
		return LO;
	}

	public void setLO(Login LO) {
		this.LO = LO;
	}

	public String login() throws NoSuchAlgorithmException {
		System.out.println("login= " + LO.getLogin());
		System.out.println("senha= " + LO.getSenha());

		boolean ok = loginDAO.getCheca(LO.getLogin(), LO.getSenha(), "1",
				"logado");
		if (ok == true) {
			System.out.println("USUARIO LOGADO COM SUCESSO");
			return "ok";

		}
		boolean admin = loginDAO.getCheca(LO.getLogin(), LO.getSenha(), "2",
				"logado");
		if (admin == true) {
			System.out.println("ADMIN LOGADO COM SUCESSO");
			return "admin";
		} else
			System.out.println("ACESSO INVÁLIDO");
		return "erro";
	}

	public List<Usuario> getUsuarios() {
		System.out.println("carregando usuarios ...");
		Session session = HibernateUtil.currentSession();
		Dao<Usuario> dao = new Dao<Usuario>(session, Usuario.class);
		return dao.list();
	}

}
Na classe LoginDAO, crio a regra de conexao com o banco postgresql;
package br.gov.rr.setrabes.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.hibernate.Session;

public class LoginDAO {
	String login;
	String senha;
	String nivel;
	String status;

	public LoginDAO() {
	}

	public LoginDAO(Session currentSession) {
		// TODO Auto-generated constructor stub
	}

	public boolean getCheca(String login, String senha, String nivel,
			String status) {

		boolean ok = false;

		try {
			Class.forName("org.postgresql.Driver").newInstance();
			System.out.println("DRIVER CARREGADO");
		} catch (Exception e) {
			System.out.println("driver nao carregado");
		}

		try {
			String sql = "SELECT * from Usuario where login=? AND senha=? AND nivel=?";

			// comentei para usar o conexao.class
			Connection c = DriverManager.getConnection(
					"jdbc:postgresql://localhost:5432/mogmo", "postgres",
					"postgres");
			PreparedStatement pstm = c.prepareStatement(sql);
			pstm.setString(1, login);
			pstm.setString(2, senha);
			pstm.setString(3, nivel);
			ResultSet rs = pstm.executeQuery();
			System.out.println("CONEXAO ESTABELECIDA");
			if (!rs.getString("login").isEmpty()
					&& rs.getString("login") != null)
				if (rs.next() && !rs.getString("login").isEmpty()
						&& rs.getString("login") != null
						&& rs.getString("login").equals(login)
						&& rs.getString("senha").equals(senha)
						&& rs.getString("nivel").equals(nivel)) {
					ok = true;
					System.out.println("Usuario carregado");
				} else {
					ok = false;
					rs.close();
					c.close();
				}

		} catch (SQLException ex) {
			ex.printStackTrace();
			status = "erro sql:" + ex.getMessage();
		}
		return ok;

	}

	public String setLogin() {

		return login;

	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNivel() {
		return nivel;
	}

	public void setNivel(String nivel) {
		this.nivel = nivel;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}
}

E ae, o que vcs acham?? onde eu posso instanciar a sessao criando um atributo?

agradeço a todos!

Y

Acho que poderia mudar um pouco o seu método getCheca para trazer o objeto login e depois alterar o LoginHandler para:

Login login = loginDAO.getCheca(LO.getLogin(), LO.getSenha(), "1",  "logado");
      if (login != null) {  
            System.out.println("ADMIN LOGADO COM SUCESSO");  
            session.setAttribute("login", login);
            return "admin";  
      } else  {
            System.out.println("ACESSO INVÁLIDO");  
            return "erro";  
      }

[]´s

Daniel

Criado 28 de agosto de 2009
Ultima resposta 22 de set. de 2009
Respostas 7
Participantes 6