Как создать фильтр для веб-приложения на основе IceFaces? - PullRequest
1 голос
/ 28 ноября 2011

Я использую IceFaces 1.8.2.Я хочу создать Filter, чтобы люди не могли получить доступ к неавторизованным URL-адресам моего приложения.

Я попытался создать Filter следующим образом:

public class AuthenticationFilter implements Filter {

    private FilterConfig config;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.config=filterConfig;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse resp=(HttpServletResponse)response;
        //HttpSession session=req.getSession(true);
        String pageRequested=req.getRequestURL().toString();
        System.out.println("Page Requested="+pageRequested);

        HttpSession session = req.getSession(false);
        if (!session.isNew()) {
          if(ManageCustomerMbeans.AUTH_KEY!=null){
            System.out.println(":::::::::::::::::::::::::Login Authenticate");
            chain.doFilter(req, resp);
          }
        }
        else {
            System.out.println("::::::::::::::::::::::::::Not Authenticate");
          //Session has expired - redirect to login.jsp
        }
    }

    public void destroy() {

    }

}

Но в результате страница с ограниченным доступом все еще отображается, если я ввожу ее URL.Если я заблокирую другую страницу следующим образом:

if (!(pageRequested.contains("Login.jsp")&&session.getAttribute(ManageCustomerMbeans.AUTH_KEY)==null)) {
    System.out.println("Filter Error!!!");
    resp.sendRedirect("./error");
} else {
    chain.doFilter(request, response);
}

тоже ничего не произойдет.

Как правильно создать Filter для веб-приложения на основе IceFaces?

************ UPDATE **************

Послеисправление от мистера BalusC, я делаю много исправлений в своем классе Filter, а также немного подправляю, потому что я использую icefaces 1.8.2..это мое исправление, и оно работает:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse resp=(HttpServletResponse)response;
        HttpSession session = req.getSession(false);
        String pageRequested=req.getRequestURL().toString();

        String resources="resources/";
        String xmlhttp="xmlhttp/";
        String kaptcha="kaptcha.jpg";
        String block="block/";
        if(pageRequested.contains("login")||pageRequested.contains(resources)
                ||pageRequested.contains(block)||pageRequested.contains(xmlhttp)
                ||pageRequested.contains(kaptcha)||pageRequested.contains("error")
                ||pageRequested.contains("logout")||pageRequested.contains("lsuccess")){

            chain.doFilter(req, resp);
        }else{

            if (session != null && session.getAttribute(ManageUsersMBeans.AUTH_KEY) != null) {

            chain.doFilter(req, resp);
            } else {

                resp.sendRedirect(req.getContextPath() + "/error");
            }
        }



    }

и в сети.xml:

    <filter>
        <filter-name>AuthenticationFilter</filter-name>
        <filter-class>com.do.tools.util.AuthenticationFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>AuthenticationFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

Если фильтр вообще не вызывается, т. Е. Метод doFilter() никогда не выполняется, тогда отображение фильтра совершенно неверно.Вам необходимо подтвердить <filter-mapping> в web.xml.Он должен отображаться либо на <servlet-name> из FacesServlet, либо на <url-pattern>, охватывающем ограниченные страницы, такие как /app/*, /secured/* и т. Д., В зависимости от структуры вашей папки.

Если фильтр действительно вызван, то ваш логический поток кода явно неверен.Давайте посмотрим на вашу первую попытку:

HttpSession session = req.getSession(false);

if (!session.isNew()) {
  if(ManageCustomerMbeans.AUTH_KEY!=null){
    chain.doFilter(req, resp);
  }
} else {
  //Session has expired - redirect to login.jsp
}

Этот поток явно неправильный.Во-первых, вы получаете сеанс с false, что означает, что он потенциально может вернуть null, но вы никогда не проверяете это.Затем вы проверяете, был ли недавно создан сеанс, который может никогда быть true, если getSession(false) возвращает ненулевой сеанс.Итак, первый блок if вводится всегда.Затем вы проверяете, является ли постоянное значение не нулевым, но это может никогда быть false, поскольку это, по-видимому, константа.Итак, ваш chain.doFilter() всегда вызывается .Предполагая, что константа представляет ключ атрибута, вам нужно переписать его следующим образом:

HttpSession session = req.getSession(false);

if (session != null && session.getAttribute(ManageCustomerMbeans.AUTH_KEY) != null) {
    chain.doFilter(req, resp);
} else {
    resp.sendRedirect(req.getContextPath() + "/login.jsp");
}

Это позволит проверить, не является ли сеанс ненулевым и содержит ли вошедший в систему пользователь.Если true, тогда продолжайте запрос, иначе перенаправьте на страницу входа.Вам нужно только убедиться, что страница входа не соответствует отображению фильтра, иначе вам нужно добавить дополнительную проверку в блоке if в URI запроса.

Ваша вторая попытка также неверна:

if (!(pageRequested.contains("Login.jsp")&&session.getAttribute(ManageCustomerMbeans.AUTH_KEY)==null)) {
    resp.sendRedirect("./error");
} else {
    chain.doFilter(request, response);
}

Это всегда перенаправляет на страницу ошибки, если пользователь не заходит на страницу входа.Это только продолжит запрос, если пользователь заходит на страницу входа в систему, когда не вошел в систему.Эта логика не имеет смысла.Но если вы говорите, что «это не работает», то это может означать только неправильное сопоставление фильтров.

0 голосов
/ 28 ноября 2011

Если вы хотите ограничить несанкционированный доступ к URL-адресам, лучший способ сделать это - использовать Servlets Security.

Некоторые ссылки:

Защита контейнеров

Ниже приведен пример, позволяющий доступ к защищенным страницам только менеджерам.

<security-constraint>

      <web-resource-collection>

          <web-resource-name>secured</web-resource-name>

          <url-pattern>/secured/*</url-pattern>

          <http-method>GET</http-method>

          <http-method>POST</http-method>

     </web-resource-collection>

     <auth-constraint>

          <role-name>Manager</role-name>

     </auth-constraint>

    <user-data-constraint>

         <transport-guarantee>CONFIDENTIAL</transport-guarantee>

    </user-data-constraint>

</security-constraint>

<security-constraint>

    <web-resource-collection>

         <web-resource-name>unsecured</web-resource-name>

               <url-pattern>/unsecured/*</url-pattern>

               <http-method>GET</http-method>

               <http-method>POST</http-method>

        </web-resource-collection>

        <auth-constraint>

               <role-name>*</role-name>

         </auth-constraint>

</security-constraint>
...