Filter para .css/.js?

Realmente o for está errado, pois não considera o próprio login como aberto para acesso. Veja o for original que mandei:

for (int i = 0; i < enderecosLivres.length; i++) {
         if (URI.startsWith(ctx + enderecosLivres[i] + "/")
                 || URI.equals(ctx + "/")
                 || URI.startsWith(ctx + "/login") // <---- AQUI
                 || URI.contains("favicon.ico")) {
            autorizado = true;
            break;
         }
      }

Além disso, você tem que colocar o nome do usuário na session após o login.

Acho que é isso :slight_smile:

Eu coloco o objeto usuario na sessao, após o login.

Eu alterei esse for, pois eu coloquei como arquivo inicial o login.jsp, entao quando eu acesso localhost://8084/Aplicacao, abre o login.jsp, sem precisar colocar nada depois da /, achei que fazendo isso funcionaria, como eu não tenho um diretorio soh para login, terei que colocar /login.jsp?
Tenho que manter URI.contains(“favicon.ico”) dentro do if? Eu nao uso ennhum favin.ico

Funcionou.

Pelo menos até agora esta funcionado, estou conseguindo acessar o login e se eu digitar alguma ação ou arquivo sem estar logado volto para a pagina de login.

Só nao estou entendendo porque que quando eu clico em uma ação que só admin pode ter acesso e se meu usuario nao for admin eu sou blokeado, mas se eu digitar direto na url eu consigo acessar, to achando q nao estou eliminando corretamente a sessao, muito estranho

Esse filtro nao funciona para ações do Struts?

Na minha lista de endereços livres está apenas o arquivo de login.jsp, porém eu nao consigo logar, acho que porque não liberei a ação login.do, mas se eu colocar essa ação na minha lista, tambem nao funciona.
Por que será?

Jeff,

Vamos separar autenticação de autorização. No primeiro momento, pelo que entendi, você quer fazer autenticação. Para que isso funcione, é preciso “acertar” o código do “if” que faz o teste de autorização de forma a permitir tudo:

Estava assim:

      if (!autorizado) { //não está na lista de exceções
         usr = (String) session.getAttribute("corporativo_usr");
         pwd = (String) session.getAttribute("corporativo_pwd");
         if (!Validador.vazio(usr)) {
            autorizado = controle.autorizar(usr, pwd, URI);
         }
      }

Deve ficar assim:

      if (!autorizado) { //não está na lista de exceções
         usr = (String) session.getAttribute("corporativo_usr");
         pwd = (String) session.getAttribute("corporativo_pwd");
//       if (!Validador.vazio(usr)) {
//          autorizado = controle.autorizar(usr, pwd, URI);
//       }
         if(usr != null) {
            autorizado = true;
         }
      }

Em um segundo momento você começa a implementar a autorização.

Eu comentei o if como voce havia falado, pois por enquanto só quero ver se o usuário está logado mesmo, não quero verificar se ele tem permissão ou nao.

O problema é o seguinte: eu coloquei na minha lista de endereços livres o login.jsp, então qualquer pessoa pode acessar esse arquivo, pois não estou validando, para esse arquivo, se o usuario esta logado ou nao, só que esse arquivo tem um formulario com action para login.do, mesmo eu colocando essa minha action na minha lista de permissoes, eu nao consigo logar, nao sei se errei em outro lugar, mas pelo que entendi, eu não estou conseguindo logar pq no login.do ainda nao criei a sessao do usuario, vou cirar no final do procedimento de login, com isso eu nao logo e volto para a pagina de login. Deu para entender?
Mesmo eu colocando o login.do na minha lista de endereços livres eu nao consigo logar, sou sempre jogado para a pagina de login de novo

Entendi, meu amigo. Vamos ver.

Você deve ter colocado sua lista de endereços livres mais ou menos assim:

/css;/img;/js;/principal;/index.jsp;/login/index.jsp;/login/login.do

Não esqueça de colocar uma / na frente dos endereços porque estes serão concatendos com o endereço da aplicação para formar a URI. Além disso, eu estou assumindo que as páginas estão dentro da pasta /login e o mapeamento do struts-config.xml está /login/login.do.

É isso?

Nao.
Eu tentei mudar as minhas paginas e ações de login para dentro de um diretorio /login e dar permissão para esse diretorio, mas começou a dar muito erro e voltei ao que estava antes.
Eu quebrei a cabeça aqui e acabei modificando o codigo que voce me mostrou nos topicos acima, até que funcionou, vou postar aqui para voce, se puder, dar uma olhada e me dizer suas criticas.
Como fiquei muito tempo em cima disso, modifiquei os codigos aqui, dei uma testada rapida e parti para outra coisa, mas pelo que pude perceber esta funcionando com um porem: se eu acessar digitando o nome direto na url parece q para de verificar se o usuario esta logado ou nao, se tem acesso ou nao, parece q soh faz a verificação se eu clicar no link, algo assim, sei la.
Meus codigos alterados agora:

web.xml:

   <filter>
        <filter-name>FiltroControleAcesso</filter-name>
        <filter-class>catalogo.controle.seguranca.FiltroControleAcesso</filter-class>
        <init-param>
            <description>URLs a serem ignoradas pelo Controle de Acesso</description>
            <param-name>enderecosLivres</param-name>
            <param-value>/css;/imagens;/uteis;/login.jsp;/login.do;/logout.do</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FiltroControleAcesso</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Filtro:

...
public class FiltroControleAcesso implements Filter {

   private FilterConfig filterConfig = null;
   private String[] enderecosLivres = null;

   @Override
   public void init(FilterConfig filterConfig) {

       try
       {
           this.filterConfig = filterConfig;
           this.enderecosLivres = filterConfig.getInitParameter("enderecosLivres").split(";");
       }
       catch (Exception ex)
       {
           ex.printStackTrace();
       }
   }

   @Override
   public void doFilter(ServletRequest request,
                        ServletResponse response,
                        FilterChain chain)
                throws IOException, ServletException {
       boolean autorizado = false;
       HttpServletRequest hrequest = (HttpServletRequest) request;

       //processa as URIs que estão na lista de exceções.
       String URI = hrequest.getRequestURI();
       String ctx = hrequest.getContextPath();

       for (int i = 0; i < enderecosLivres.length; i++)
       {
           if (URI.startsWith(ctx + enderecosLivres[i] + "/")
               || URI.equals(ctx + "/login.jsp")
               || URI.equals(ctx + "/login.do")
               || URI.equals(ctx + "/logout.do"))
           {
               autorizado = true;
               break;
           }
       }

       HttpSession session = hrequest.getSession(true);
       Usuario user = null;
       
       if (autorizado) //autorizado
       {
           chain.doFilter(request, response);
       }
       else //não está na lista de exceções
       {
           user = (Usuario) session.getAttribute("usuario");

           if (user != null)
           {
               chain.doFilter(request, response);
           }
           else
           {
               RequestDispatcher rd = hrequest.getRequestDispatcher("/logar.do");
               rd.forward(request, response);
           }
   }

   @Override
   public void destroy() {
   }
}