Controle de acesso

15 respostas
E

Pessoal, tenho o seguinte cenário:

um sistema onde está sendo utilizado hibernate + flex, e WebServices entre os dois. Estou com dificuldade para encontrar uma solução para controle de acesso. Por exemplo, redirecionar uma pessoa para a pagina de login caso tente fazer alguma coisa sem estar logado.
Alguem me sugere alguma coias ?

obs.: procurei tanto no google quanto aqui no GUJ mas não encontrei nada que me ajudasse.

Agradeço desde ja ;D

15 Respostas

E

alguem ? …

christianovale

Sua aplicação é Web?

Se for coloque o Usuario Logado (Objeto) na sessão.

Sempre antes de cada ação na tela vc recupera esse objeto da sessão e testa sua permissões (Leitura, Escrita, etc…).

Caso o usuário recuperado da sessão seja null , que dizer que não houve logon no sistema, entao vc direciona o cara para a tela de login.

Abraços.

Sucesso.

E

Minha aplicação é web sim, mas o problema é o seguinte. A parte de visualização ta sendo feita em flex por um outro pessoal, eu to fazendo a parte de persistencia e webServices. Tipo, não faço ideia de como posso trabalhar com a sessão.

danilopelegrino

Exemplo com JSP e Servlet + AuthFilter:

Servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, SQLException {
        response.setContentType("text/html;charset=UTF-8");

        Users user = new Users();
        UserControl ctl = new UserControl();

        user.setLogin(request.getParameter("user"));
        user.setPassWord(request.getParameter("password"));

        if(ctl.verifUser(user)) {
            request.getSession().setAttribute("isLogged", new Boolean(true));
            response.sendRedirect("principal.jsp");
        } else {
            response.sendRedirect("errorLogin.jsp");
        }
        
    }

AuthFilter:

public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        Object logged = req.getSession().getAttribute("isLogged");
        String url = req.getRequestURL().toString();

        if(logged == null && !url.contains("errorLogin.jsp") && !url.contains("index.jsp") && !url.contains("VerifUserServlet") && !url.contains("images")) {
            res.sendRedirect("index.jsp");
            return;
        }
        
        chain.doFilter(request, response);
	}

obs: Este exemplo mostra como manter um user logado até que a sessao expire. Basta você adaptar a logica de controle de acesso.

E

Cara valeu mesmo pela ajuda, mas no meu caso eu acho que isso não vai rolar, o client ta sendo feito com Flex e se comunicando com a aplicação por WebServices. O que eu preciso de fato é algo como o Jaas, ou o AspectJ mas esses caras eu ainda não consegui implementar.
Você conhece algum desses dois ?

Marco_A_Caetano

Tem vários modos de fazer…
A maneira mais simples que eu penso agora é criar uma coluna status na tabela de usuarios, quando logar setar o campo para true, e passar o id em todas os redirecionamentos.
Na head de todas as páginas pode dar um select nesse campo por esse id e verificar se está ou não.

Mas é só uma opção.

E

Muito obrigado pela ajuda. Mas acho que no meu caso aqui preciso de alguma coisa mais específica. mas de qualquer forma muito obrigado, todas as sugestões são muuuuuito bem vindas :D.

mais alguem ?

fantomas

egamorim:
Minha aplicação é web sim, mas o problema é o seguinte. A parte de visualização ta sendo feita em flex por um outro pessoal, eu to fazendo a parte de persistencia e webServices. Tipo, não faço ideia de como posso trabalhar com a sessão.

Sendo assim, talvez vc não tenha que fazer nada. A equipe que está com a parte do flex não pode fazer isto, já que eles tem o acesso a sessão?

flws

E

Então cara, na verdade eu to tentando me precaver para um possivel problema, na verdade pode ser sim que isso seja resolvido por la, mas caso não, preciso estar apto a fazer quando chegar a hora, e outra, pra mim seria otimo conhecer esse tipo de solução mesmo que não seja pra este projeto especificamente. Eu estava lendo sobre AspectJ e Jaas, alguem ai ja trabalhou com isso e pode me dizer por onde devo ir pra conseguir trabalhar com esses caras ?

Muito obrigado a todos pelas respostas.

Kleber-rr
danilopelegrino:
Exemplo com JSP e Servlet + AuthFilter: Servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, SQLException {
        response.setContentType("text/html;charset=UTF-8");

        Users user = new Users();
        UserControl ctl = new UserControl();

        user.setLogin(request.getParameter("user"));
        user.setPassWord(request.getParameter("password"));

        if(ctl.verifUser(user)) {
            request.getSession().setAttribute("isLogged", new Boolean(true));
            response.sendRedirect("principal.jsp");
        } else {
            response.sendRedirect("errorLogin.jsp");
        }
        
    }

AuthFilter:

public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        Object logged = req.getSession().getAttribute("isLogged");
        String url = req.getRequestURL().toString();

        if(logged == null && !url.contains("errorLogin.jsp") && !url.contains("index.jsp") && !url.contains("VerifUserServlet") && !url.contains("images")) {
            res.sendRedirect("index.jsp");
            return;
        }
        
        chain.doFilter(request, response);
	}

obs: Este exemplo mostra como manter um user logado até que a sessao expire. Basta você adaptar a logica de controle de acesso.

Olá danilo, td bem??

Cara, achei muito interessante tua implentação, mas me diz uma coisa: na minha aplicação web, uso o hibernate e uso o banco postgres. Eu tenho uma classe HibernateSessionFilter que gerencia as sessões. tenho uma classe LoginDAO que faz a conexao para verificacao de usuario e senha, e tenho uma classe loginHandler para gerenciar as regras de acesso. Qual seria a forma mais facil de implementar essa tua lógica nas minhas classes?? Desculpa se a pergunta parecer besta, é que eu sou iniciante em java e tem sido dificil resolver essa pendencia.

Segue minhas classes:

HibernateSessionFilter:
package br.gov.rr.setrabes.util;

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;

public class HibernateSessionFilter implements Filter {

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
			throws IOException, ServletException {

		HibernateUtil.openSession();
		try {
			HibernateUtil.currentSession().beginTransaction();
			fc.doFilter(req, res);
			HibernateUtil.currentSession().getTransaction().commit();
		} catch (Exception e) {
			throw new ServletException(e);
		} finally {
			HibernateUtil.closeCurrentSession();
		}
	}

	public void init(FilterConfig c) {
	}

	public void destroy() {
	}

}
Minha classe LoginDAO:
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;

public class LoginDAO {

	public LoginDAO() {
	}

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

		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.next() && 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 {

			}

			rs.close();
			c.close();

		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		return ok;

	}

}
A Classe LoginHandler:
package br.gov.rr.setrabes.handler;

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();

	/** Creates a new instance of ControleLogin */
	public LoginHandler() {

	}

	private Login LO = new Login();

	// 
	public Login getLO() {
		return LO;
	}

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

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

		// //poe booleano na sessao
		// HttpSession session = session.setAttribute();

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

		}
		boolean admin = loginDAO.getCheca(LO.getLogin(), LO.getSenha(), "2");
		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();
	}

}
juniorsatanas

Kleber-rr Boa Noite, estou tenando fazer a mesma coisa que você no fim das contas deu tudo certo, baseado nas suas classes fiz muita coisa, poderia postar aqui o resultado ?

eu pensei nisso :

1. protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
   2.     throws ServletException, IOException, SQLException {  
   3.         response.setContentType("text/html;charset=UTF-8");  
   4.   
   5.         Users user = new Users();  
   6.         UserControl ctl = new UserControl();  
   7.   
   8.         user.setLogin(request.getParameter("user"));  
   9.         user.setPassWord(request.getParameter("password"));  
  10.   
  11.         if(ctl.verifUser(user)) {  
  12.             request.getSession().setAttribute("isLogged", new Boolean(true));  
  13.             response.sendRedirect("principal.jsp");  
  14.         } else {  
  15.             response.sendRedirect("errorLogin.jsp");  
  16.         }  
  17.           
  18.     }   
   1. protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
   2.     throws ServletException, IOException, SQLException {  
   3.         response.setContentType("text/html;charset=UTF-8");  
   4.   
   5.         admin admin = new admin();  
   6.         adminControl ctl = new adminControl();  
   7.   
   8.         admin.setLogin(request.getParameter("admin"));  
   9.         admin.setPassWord(request.getParameter("password"));  
  10.   
  11.         if(ctl.verifadmin(admin)) {  
  12.             request.getSession().setAttribute("isLogged", new Boolean(true));  
  13.             response.sendRedirect("principalADMIN.jsp");  
  14.         } else {  
  15.             response.sendRedirect("errorLoginADMIN.jsp");  
  16.         }  
  17.           
  18.     }   


//E SE  PRECISARCE DE OUTROS TIPOS DE USUARIOS ERA SO CRIAR, mas isso ia me gerar muitas telas....

Após 4 meses deve ter resolvido !

abraço jr

joaosavio
Kleber-rr:
danilopelegrino:
Exemplo com JSP e Servlet + AuthFilter: Servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, SQLException {
        response.setContentType("text/html;charset=UTF-8");

        Users user = new Users();
        UserControl ctl = new UserControl();

        user.setLogin(request.getParameter("user"));
        user.setPassWord(request.getParameter("password"));

        if(ctl.verifUser(user)) {
            request.getSession().setAttribute("isLogged", new Boolean(true));
            response.sendRedirect("principal.jsp");
        } else {
            response.sendRedirect("errorLogin.jsp");
        }
        
    }

AuthFilter:

public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        Object logged = req.getSession().getAttribute("isLogged");
        String url = req.getRequestURL().toString();

        if(logged == null && !url.contains("errorLogin.jsp") && !url.contains("index.jsp") && !url.contains("VerifUserServlet") && !url.contains("images")) {
            res.sendRedirect("index.jsp");
            return;
        }
        
        chain.doFilter(request, response);
	}

obs: Este exemplo mostra como manter um user logado até que a sessao expire. Basta você adaptar a logica de controle de acesso.

Olá danilo, td bem??

Cara, achei muito interessante tua implentação, mas me diz uma coisa: na minha aplicação web, uso o hibernate e uso o banco postgres. Eu tenho uma classe HibernateSessionFilter que gerencia as sessões. tenho uma classe LoginDAO que faz a conexao para verificacao de usuario e senha, e tenho uma classe loginHandler para gerenciar as regras de acesso. Qual seria a forma mais facil de implementar essa tua lógica nas minhas classes?? Desculpa se a pergunta parecer besta, é que eu sou iniciante em java e tem sido dificil resolver essa pendencia.

Segue minhas classes:

HibernateSessionFilter:
package br.gov.rr.setrabes.util;

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;

public class HibernateSessionFilter implements Filter {

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
			throws IOException, ServletException {

		HibernateUtil.openSession();
		try {
			HibernateUtil.currentSession().beginTransaction();
			fc.doFilter(req, res);
			HibernateUtil.currentSession().getTransaction().commit();
		} catch (Exception e) {
			throw new ServletException(e);
		} finally {
			HibernateUtil.closeCurrentSession();
		}
	}

	public void init(FilterConfig c) {
	}

	public void destroy() {
	}

}
Minha classe LoginDAO:
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;

public class LoginDAO {

	public LoginDAO() {
	}

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

		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.next() && 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 {

			}

			rs.close();
			c.close();

		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		return ok;

	}

}
A Classe LoginHandler:
package br.gov.rr.setrabes.handler;

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();

	/** Creates a new instance of ControleLogin */
	public LoginHandler() {

	}

	private Login LO = new Login();

	// 
	public Login getLO() {
		return LO;
	}

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

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

		// //poe booleano na sessao
		// HttpSession session = session.setAttribute();

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

		}
		boolean admin = loginDAO.getCheca(LO.getLogin(), LO.getSenha(), "2");
		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();
	}

}

Cara, pq tu nao usa so o hibernate?

Qto a sua duvida, são sessions diferentes. Vc esta fazendo a session com o bd. A session implementada pelo filtro de autenticacao é a session com o navegador. Se vc nao fizer isso, mesmo com um sistema de login e senha, se o usuario digitar na barra de enderecos um endereco de página do admin, ele vai conseguir entrar! Por isso o filtro de autenticacao.
Vc mapeia as páginas que passarao pelo filtro, aí vc ve se a pessoa q esta entrando (no caso a session relativa ao navegador) está logada

abs

Kleber-rr

Pessoal, fazia tempo q naum olhava esse post… e de repente ele ressucitou!!! Aleluia!!! huahauhaha

blz, é o seguinte moçada, eu pulei essa etapa para naum perder mto tempo no projeto, mas vou voltar a bater nessa tecla…
Aí voltaremos a discutir sobre isso, blz??

Abs.

juniorsatanas

joaosavio e Kleber-rr Bom dia !

Kleber-rr fiz a mesma coisa antes... pulei... ahahahah !








       João, gostei do seu código ficou limpo e bem feito, irei adaptalo as minhas idéias aqui ! valeu !
juniorsatanas

Kleber-rr você não ta usando HIBERNATE ?

Criado 6 de julho de 2009
Ultima resposta 25 de jan. de 2010
Respostas 15
Participantes 8