Controlar acesso ao sistema

9 respostas Resolvido
java
J

Olá Pessoal!

Tenho um sistema e nele fiz controle de acesso por sessão, quando usuário loga no sistema é mostrado para o mesmo uma tela de menu com as permissões que foram concedidas para este usuário.
Agora caso um usuário descubra o endereço de uma pagina do sistema em que ele não tenha acesso, e este usuário digita o endereço no browser o mesmo consegue acessar a pagina onde ele não tem permissão.
Como faço para corrigir isto?

Abaixo esta o código de acesso ao sistema:

public class Logar extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String usuario = request.getParameter("usuario");
    String senha = request.getParameter("senha");
    RequestDispatcher rd = null;
    HttpSession sessao = request.getSession();

    UsuarioDAO usuarioDAO = new UsuarioDAO();
    Usuarios usuarios = usuarioDAO.getUsuario(usuario, senha);

    if(usuarios != null && usuarios.getNivel() == 1){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 2){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index1.jsp");
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 3){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index2.jsp");
        rd.forward(request, response);
    }else{
        request.setAttribute("mensagem", "Usuario ou Senha Invalido!");
        rd = request.getRequestDispatcher("/login.jsp");
        rd.forward(request, response);
    }
}

Abaixo está o código de um servlet onde um determinado usuário não tem acesso. (LEMBRANDO QUE É NESTE CÓDIGO QUE DESEJO COLOCAR O BLOQUEIO PARA O USUÁRIO SEM PERMISSÃO):

public class PedidosPendentes extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    int numPagina = 1;
    if(request.getParameter("numpagina") != null)
        numPagina = Integer.parseInt(request.getParameter("numpagina"));

    VendaDAO vendaDAO = new VendaDAO();
    try {

        String ordenacao = request.getParameter("ordenacao");
        if(ordenacao == null)
            ordenacao = "vencodigo";

        List listaPedidosPendentes = vendaDAO.getListaVendaPendentePaginada(numPagina, ordenacao);
        String qtdTotalPendente = vendaDAO.totalRegistrosPendentes();
        request.setAttribute("sessaoPedidosPedentes", listaPedidosPendentes);
        request.setAttribute("sessaoTotalPedidosPedentes", qtdTotalPendente);
        RequestDispatcher rd = request.getRequestDispatcher("/pedidospendentes.jsp");
        rd.forward(request, response);
    } catch (SQLException ex) {
        Logger.getLogger(PedidosPendentes.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Eu havia feito isto, mas não funcionou:

public class PedidosPendentes extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    Usuarios usuarios = new Usuarios();

   if(usuarios.getNivel() == 1){//este usuario pode acessar este servlet

    int numPagina = 1;
    if(request.getParameter("numpagina") != null)
        numPagina = Integer.parseInt(request.getParameter("numpagina"));

    VendaDAO vendaDAO = new VendaDAO();
    try {

        String ordenacao = request.getParameter("ordenacao");
        if(ordenacao == null)
            ordenacao = "vencodigo";

        List listaPedidosPendentes = vendaDAO.getListaVendaPendentePaginada(numPagina, ordenacao);
        String qtdTotalPendente = vendaDAO.totalRegistrosPendentes();
        request.setAttribute("sessaoPedidosPedentes", listaPedidosPendentes);
        request.setAttribute("sessaoTotalPedidosPedentes", qtdTotalPendente);
        RequestDispatcher rd = request.getRequestDispatcher("/pedidospendentes.jsp");
        rd.forward(request, response);
    } catch (SQLException ex) {
        Logger.getLogger(PedidosPendentes.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

Alguém pode me ajudar?

9 Respostas

B
Solucao aceita

na faculdade pro tcc eu implementei a interface filter:

public class Filtro implements Filter{

/**
 * Método que inicializa o filtro
 * @param filterConfig configuração do filterConfig
 * @throws ServletException caso gere alguma excessão
 */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

/**
 * Método que verifica todas requisições e respostas
 * @param request request do navegador
 * @param response resposta do navegador
 * @param chain deixa ir
 * @throws IOException caso gere alguma excessão
 * @throws ServletException caso gere alguma excessão
 */
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    
    HttpSession session = req.getSession();
    
    if(session.getAttribute("user") != null){
        chain.doFilter(request, response);
    }else{
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }
}

/**
 * Destroi
 */
@Override
public void destroy() {
}

}

vê se te ajuda…só que vc vai ter q mapear o filtro no web.xml tbm

J

Olá blayd2015!

Neste caso vou ter de implementar isto no servlet?

B

ññ, isso é um filtro, é uma outra classe só que vc vai ter q mapear ele no web.xml

no web.xml:

<filter>
    <filter-name>NomeFiltro</filter-name>
    <filter-class>br.com.projeto.filtro.NomeClasse</filter-class>
</filter>
<filter-mapping>
    <filter-name>NomeFiltro</filter-name>
    <url-pattern>/admin/content/*</url-pattern><!-- pastas onde vc deseja q o filtro atue -->
</filter-mapping>
B

Na apostila fj21 tem um capítulo somente sobre filtros, dá uma olhadinha, vale a pena…

Basicamente você define ás urls que o filtro vai ser executado ANTES da requisição chegar na Servlet principal e após sair dela, perfeito para controle de acessos…

J

Olá blayd2015!

Era isto mesmo que eu estava precisando, mas ao invés de criar uma classe java normal implementando Filter, fiz logo um Arquivo Filter e com isto o netbeans mapeou o arquivo xml automaticamente!

F

poderia postar o codigo estou implementando um controle de acesso por sessão também

J

Olá Felipe100!

Na verdade deu tela branca, vou corrigir isto e depois envio o codigo!

F

ok obrigado

J

Olá Felipe!

Agora está funcionando de forma correta. Segue abaixo o servlet utilizado para logar no sistema:

public class Logar extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String usuario = request.getParameter("usuario");
    String senha = request.getParameter("senha");
    RequestDispatcher rd = null;
    HttpSession sessao = request.getSession();

    UsuarioDAO usuarioDAO = new UsuarioDAO();
    Usuarios usuarios = usuarioDAO.getUsuario(usuario, senha);

    if(usuarios != null && usuarios.getNivel() == 1){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        sessao.setAttribute("nivel", usuarios.getNivel());
        rd = request.getRequestDispatcher("/index.jsp");
        //System.out.println(usuarios.getNivel());
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 2){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        sessao.setAttribute("nivel", usuarios.getNivel());
        rd = request.getRequestDispatcher("/index1.jsp");
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 3){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index2.jsp");
        rd.forward(request, response);
    }else{
        request.setAttribute("mensagem", "Usuario ou Senha Invalido!");
        rd = request.getRequestDispatcher("/login.jsp");
        rd.forward(request, response);
    }
}

OBS.; AQUI É O TRECHO DO CÓDIGO ACIMA ONDE PEGO O NÍVEL DE ACESSO DO USUÁRIO:
sessao.setAttribute(“nivel”, usuarios.getNivel());

Abaixo está o servlet que utilizo para exibir uma pagina, onde quem pode acessar é somente o usuario com nível de acesso=1:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException, SQLException {

response.setContentType(text/html;charset=UTF-8);

PrintWriter out = response.getWriter();
int numPagina = 1;
    if (request.getParameter("numpagina") != null) {
            numPagina = Integer.parseInt(request.getParameter("numpagina"));
        }

    VendaDAO vendaDAO = new VendaDAO();
    try{
        String ordenacao = request.getParameter("ordenacao");
        if(ordenacao == null)
            ordenacao = "vencodigo";

        String pesquisa = request.getParameter("pesquisa");
        if(pesquisa == null)
            pesquisa = "";

        String campoapesquisar = request.getParameter("campoapesquisar");
        if(campoapesquisar == null)
            campoapesquisar = "vencli";

        List listaVenda = vendaDAO.getListaVendaPaginada(numPagina, ordenacao, pesquisa, campoapesquisar);
        String totalRegistros = vendaDAO.totalRegistros();
        request.setAttribute("sessaoListaVenda", listaVenda);
        request.setAttribute("sessaoQtdTotalPedidos", totalRegistros);
        RequestDispatcher rd = request.getRequestDispatcher("/listapedidos.jsp");
        rd.forward(request, response);
    }catch(SQLException er){
        Logger.getLogger(PedidosCRUD.class.getName()).log(Level.SEVERE, null, er);
    }
}

Abaixo está o filtro que utilizei para controlar o acesso ao servlet acima:

public class Filtro implements Filter {

private static final boolean debug = true;
// The filter configuration object we are associated with.  If
// this value is null, this filter instance is not currently
// configured. 
private FilterConfig filterConfig = null;

public Filtro() {
}

private void doBeforeProcessing(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
    if (debug) {
        log("Filtro:DoBeforeProcessing");
    }

    // Write code here to process the request and/or response before
    // the rest of the filter chain is invoked.

    // For example, a logging filter might log items on the request object,
    // such as the parameters.
/*
    for (Enumeration en = request.getParameterNames(); en.hasMoreElements(); ) {
    String name = (String)en.nextElement();
    String values[] = request.getParameterValues(name);
    int n = values.length;
    StringBuffer buf = new StringBuffer();
    buf.append(name);
    buf.append("=");
    for(int i=0; i < n; i++) {
    buf.append(values[i]);
    if (i < n-1)
    buf.append(",");
    }
    log(buf.toString());
    }
     */
}

private void doAfterProcessing(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
    if (debug) {
        log("Filtro:DoAfterProcessing");
    }

    // Write code here to process the request and/or response after
    // the rest of the filter chain is invoked.

    // For example, a logging filter might log the attributes on the
    // request object after the request has been processed.
/*
    for (Enumeration en = request.getAttributeNames(); en.hasMoreElements(); ) {
    String name = (String)en.nextElement();
    Object value = request.getAttribute(name);
    log("attribute: " + name + "=" + value.toString());

    }
     */

    // For example, a filter might append something to the response.
/*
    PrintWriter respOut = new PrintWriter(response.getWriter());
    respOut.println("<P><B>This has been appended by an intrusive filter.</B>");
     */
}

/**
 *
 * @param request The servlet request we are processing
 * @param response The servlet response we are creating
 * @param chain The filter chain we are processing
 *
 * @exception IOException if an input/output error occurs
 * @exception ServletException if a servlet error occurs
 */
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
   
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    HttpSession session = req.getSession();

    Integer nivel = (Integer) session.getAttribute("nivel");

    if (nivel.intValue() == 1) {
        chain.doFilter(request, response);
    } else {
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }
}

/**
 * Return the filter configuration object for this filter.
 */
public FilterConfig getFilterConfig() {
    return (this.filterConfig);
}

/**
 * Set the filter configuration object for this filter.
 *
 * @param filterConfig The filter configuration object
 */
public void setFilterConfig(FilterConfig filterConfig) {
    this.filterConfig = filterConfig;
}

/**
 * Destroy method for this filter 
 */
public void destroy() {
}

/**
 * Init method for this filter 
 */
public void init(FilterConfig filterConfig) {
    this.filterConfig = filterConfig;
    if (filterConfig != null) {
        if (debug) {
            log("Filtro:Initializing filter");
        }
    }
}

/**
 * Return a String representation of this object.
 */
@Override
public String toString() {
    if (filterConfig == null) {
        return ("Filtro()");
    }
    StringBuffer sb = new StringBuffer("Filtro(");
    sb.append(filterConfig);
    sb.append(")");
    return (sb.toString());
}

private void sendProcessingError(Throwable t, ServletResponse response) {
    String stackTrace = getStackTrace(t);

    if (stackTrace != null && !stackTrace.equals("")) {
        try {
            response.setContentType("text/html");
            PrintStream ps = new PrintStream(response.getOutputStream());
            PrintWriter pw = new PrintWriter(ps);
            pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N

            // PENDING! Localize this for next official release
            pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");
            pw.print(stackTrace);
            pw.print("</pre></body>\n</html>"); //NOI18N
            pw.close();
            ps.close();
            response.getOutputStream().close();
        } catch (Exception ex) {
        }
    } else {
        try {
            PrintStream ps = new PrintStream(response.getOutputStream());
            t.printStackTrace(ps);
            ps.close();
            response.getOutputStream().close();
        } catch (Exception ex) {
        }
    }
}

public static String getStackTrace(Throwable t) {
    String stackTrace = null;
    try {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        t.printStackTrace(pw);
        pw.close();
        sw.close();
        stackTrace = sw.getBuffer().toString();
    } catch (Exception ex) {
    }
    return stackTrace;
}

public void log(String msg) {
    filterConfig.getServletContext().log(msg);
}

}

OBS.: O CONTROLE DE ACESSO ESTÁ DESCRITO NO METODO ACIMA doFilter:

HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    HttpSession session = req.getSession();

    Integer nivel = (Integer) session.getAttribute("nivel");

    if (nivel.intValue() == 1) {
        chain.doFilter(request, response);
    } else {
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

OBS.; O NIVEL DE ACESSO NO MEU BD É INTEGER SE FOSSE STRING FARIA DA SEGUINTE FORMA:

String nivel = (String) session.getAttribute(“nivel”);

if (nivel.equals("1")) {
        chain.doFilter(request, response);
    } else {
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

DESTA FORMA MEU FILTRO DE CONTROLE UTILIZANDO SESSÃO FUNCIONOU PERFEITAMENTE!

Criado 16 de agosto de 2017
Ultima resposta 21 de ago. de 2017
Respostas 9
Participantes 4