JSF - реализация фильтра для страниц с ограниченным доступом

Я следую ответу @BalusC на JSF 2.0: Как получить URL-адрес, введенный в адресную строку браузера, чтобы запретить доступ к страницам пользователям, не вошедшим в систему.

Фильтр:

public class RestrictPageFilter implements Filter{
    FilterConfig fc;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        fc=filterConfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpreq = (HttpServletRequest) request;
        HttpServletResponse httpres = (HttpServletResponse) response;
        if (httpreq.getUserPrincipal() == null) {
            httpreq.getSession().setAttribute("from", httpreq.getRequestURI());
            httpres.sendRedirect("/pages/login.xhtml");
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }
}

веб.xml:

<security-constraint>
    <web-resource-collection>
      <web-resource-name>Admin pages</web-resource-name>
      <url-pattern>/admin/*</url-pattern>
      <url-pattern>/restricted/*</url-pattern>
      <http-method>GET</http-method>
          <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>ADMIN</role-name>
    </auth-constraint>
  </security-constraint>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>User pages</web-resource-name>
      <url-pattern>/restricted/*</url-pattern>
      <http-method>GET</http-method>
          <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>ADMIN</role-name>
      <role-name>USER</role-name>
    </auth-constraint>
  </security-constraint>

   <!--login-config>
     <auth-method>FORM</auth-method>
     <realm-name>jdbc-realm</realm-name>
     <form-login-config>
       <form-login-page>/pages/login.xhtml</form-login-page>
       <form-error-page>/pages/error.xhtml</form-error-page>
     </form-login-config>
   </login-config-->

    <filter>
        <filter-name>RestrictPageFilter</filter-name>
        <filter-class>gov.denis.chanceryweb5.filter.RestrictPageFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>RestrictPageFilter</filter-name>
        <url-pattern>/restricted/*</url-pattern>
    </filter-mapping> 

стеклянная рыба-web.xml

<glassfish-web-app>
<security-role-mapping>
    <role-name>ADMIN</role-name>
    <group-name>ADMIN</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>USER</role-name>
    <group-name>USER</group-name>
  </security-role-mapping>

realm in glassfish gui console: enter image description here

При доступе к моему веб-приложению в браузере я вижу это по какой-то причине? Зачем?

введите здесь описание изображения


person Melissaa    schedule 12.04.2012    source источник
comment
Не знаю, связано ли это с аутентификацией, но ваш фильтр не должен отображаться на всех страницах с *.xhtml (он вызывается на каждой странице, включая индекс). Вы должны отображать его только на страницах с ограниченным доступом, которые, я полагаю, не являются индексом.   -  person Fallup    schedule 12.04.2012
comment
так что я должен переместить login.xtml из страниц, которые я хочу ограничить?   -  person Melissaa    schedule 12.04.2012
comment
Страницы входа должны быть вне ограничений безопасности. Как выглядят таблицы вашей базы данных? Они у вас уже были и вы пытаетесь адаптировать их к JDBCRealm в GlassFish?   -  person rbento    schedule 12.04.2012
comment
@Melissaa да, и вы можете добиться этого, изменив сопоставление фильтра на что-то вроде ‹url-pattern›/restricted/*‹/url-pattern› в зависимости от расположения ваших страниц с ограниченным доступом. index.xhtml должен находиться в какой-то общей папке или просто за пределами папки с ограниченным доступом.   -  person Fallup    schedule 12.04.2012
comment
Страница входа перемещена из страниц с ограниченным доступом. проблема осталась :(   -  person Melissaa    schedule 13.04.2012


Ответы (1)


Вы видите диалоговое окно, связанное с методом аутентификации BASIC.

В настоящее время вы закомментировали элементы login-config вашего файла web.xml... так что эта конфигурация не применяется.

Серверы GlassFish 3 имеют конфигурацию входа по умолчанию, которая используется, когда развернутое пользователем приложение указывает ограничение безопасности, но не указывает конфигурацию входа...

Эффективная конфигурация входа в систему для вашего приложения на самом деле выглядит примерно так:

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>file</realm-name>
  </login-config>

Логин-конфиг по умолчанию указан в glassfish3/glassfish/domains/<your domain name here>/config/default-web.xml

person vkraemer    schedule 12.04.2012
comment
Спасибо за ответ. Я закомментировал логин-конфигурацию, потому что ответ на вопрос, который я связал, говорит, что мне нужно заменить его фильтром. Значит, это неправильно? - person Melissaa; 13.04.2012
comment
@Melissaa: я никогда не знал, что BalusC дает неверный ответ, когда сервером является Tomcat. К сожалению, каждому серверу разрешено «добавлять ценность» в областях, которые не регулируются спецификациями. Это область, в которой TC и GF различаются. Если вы хотите, чтобы GlassFish вел себя как Tomcat (в этой конкретной области), вы можете удалить элемент login-config по умолчанию из config/default-web.xml. - person vkraemer; 13.04.2012
comment
я закомментировал логин-конфигурацию по умолчанию. Но похоже request.login(name, pass) не работает без login-config в web.xml - person Melissaa; 17.04.2012
comment
@Melissa Вы повторно развернули приложение после того, как отредактировали файл config/default-web.xml? - person vkraemer; 19.04.2012