2013-05-20 3 views
1

Итак, я столкнулся с довольно сложным вопросом, похожим на мой, и я начал его получать, пока не понял, что нет. Короче говоря, вот история:Фильтр аутентификации Homegrown не отображает страницу приветствия

В аутентификационном компоненте успех аутентификации должен привести к доступу к некоторым веб-ресурсам, отказ должен «фильтровать» доступ и перенаправлять на текущую страницу входа. Теперь, в этой аутентификации бобе, я добавил эту строку в случае успеха:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(authentificationBean1.AUTH_STATE, "true") ; 

AUTH_STATE определяется в компоненте, как:

public static final String AUTH_STATE = ""; 

В случае неудачи, я следующее :

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(authentificationBean1.AUTH_STATE, null) ; 

Теперь в фильтре (один, который применяется к каждому файлу кроме аутентификации страницы), мой doFilter м еню выглядит следующим образом:

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

     if (((HttpServletRequest) request).getSession().getAttribute(authentificationBean1.AUTH_STATE) == null) { 
      ((HttpServletResponse) response).sendRedirect("authentification.xhtml"); 

     } 

     if(((HttpServletRequest) request).getSession().getAttribute(authentificationBean1.AUTH_STATE) != null) { 
      ((HttpServletResponse) response).sendRedirect("accueil.xhtml"); 
     } 

    } 

Моя идея была, что если аутентификация прошла успешно, то authentificationBean1.AUTH_STATE сессия attribut будет установлен на что-то не нулевой, таким образом, в испытании фильтра я буду иметь возможность перенаправить страница welcom (accueil.xhtml); если этот атрибут равен нулю, мы останемся на странице аутентификации.

Дегустация всего: фильтр, похоже, работает, но слишком много, поэтому я имею в виду, даже если проверка аутентификации должна быть успешной, она не позволяет мне перейти на страницу приветствия. На самом деле он отлично работал без фильтра, похоже, что я пропустил что-то об использовании фильтров с JSF или фильтрами.

P.S: не применялся chain.doFilter, потому что у меня нет другого фильтра для вызова, но что-то подозреваю.

Спасибо за ваши указания.

EDIT:

<filter> 
     <filter-name>RestrictionFilter</filter-name> 
     <filter-class>beans.RestrictionFilter</filter-class> 
</filter> 
<filter-mapping> 
     <filter-name>RestrictionFilter</filter-name> 
     <url-pattern>/faces/accueil.xhtml</url-pattern> 
</filter-mapping> 
+0

Не могли бы вы разместить свой web.xml? – dratewka

+0

Уверенная вещь (извините за опоздание), я отредактирую свой первоначальный пост. – Akheloes

+0

Я сделал несколько System.out здесь, теперь я могу заметить, что когда ** AUTH_STATE ** имеет значение NULL, это не учитывается, в противном случае я получил фильтр для работы в другом месте (где ** AUTH_STATE ** не равно null). – Akheloes

ответ

3

Ваш фильтр работает в бесконечном цикле, перенаправляя к себе каждый раз. Он никогда не продолжает запрос сервлета. Похоже, вы неправильно поняли, как работает HTTP. С response.sendRedirect() вы в основном запускаете новый HTTP-запрос. Этот новый HTTP-запрос снова вызовет фильтр. Поэтому, когда ваш фильтр соответствует условию для перенаправления на accueil.xhtml, он будет перенаправлять на эту страницу в бесконечном цикле и никогда не будет продолжать сервлет, чтобы обработать запрос.

Далее вы также неправильно поняли значение chain.doFilter(). Он явно не переходит к следующему фильтру. Это просто продолжает запрос, как будто не было фильтра. Есть ли другой фильтр, следующий в цепочке или нет, совершенно не имеет значения. Если фильтра нет, тогда он просто окажется в целевом сервлете (который является FacesServlet в вашем случае, кто отвечает за обработку страницы JSF).

В основном, поток должен выглядеть следующим образом:

  • Если пользователь не вошел в систему, а затем:
    • Если запрошенная страница в настоящее время не authentification.xhtml, а затем перенаправить на него.
    • Или если на запрашиваемой странице уже authentification.xhtml, тогда продолжить запрос.
  • Или, если пользователь выполнил вход в систему, продолжите запрос независимо от запрашиваемой страницы.

Другими словами, это должно сделать это:

, что я также добавил проверку на JSF ресурсов (в/JS файлов/изображений CSS включены через <h:outputStylesheet|outputScript|graphicImage>)
@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {  
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(false); 
    String loginURL = request.getContextPath() + "/authentification.xhtml"; 

    boolean loggedIn = session != null && session.getAttribute(authentificationBean1.AUTH_STATE) != null; 
    boolean loginRequest = request.getRequestURI().startsWith(loginURL); 
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER); 

    if (loggedIn || loginRequest || resourceRequest)) { 
     chain.doFilter(request, response); 
    } else { 
     response.sendRedirect(loginURL); 
    } 
} 

Примечание, в противном случае они также будут блокируется при представлении страницы входа в систему. Также обратите внимание, что этот фильтр можно отобразить на /*, а не только на одной странице.

+0

бесконечный цикл, который я не представлял ... Так что фильтр запускается каждый раз, когда я пытаюсь получить доступ к «фильтруемому» ressource , правильно ? – Akheloes

+0

Фильтр вызывается для каждого HTTP-запроса, соответствующего шаблону URL. Переадресация позволяет клиенту создать новый HTTP-запрос. В основном ваш фильтр продолжал инструктировать клиента для создания нового HTTP-запроса. – BalusC

+0

Теперь, например, я сопоставил свой фильтр с accueil.xhtml, то есть каждый раз, когда эта страница называется фильтром, будет вмешиваться в «doFiltre» что-то, нет? Извините за настаивание, прочитайте несколько статей, но они, похоже, просто представляют код без подпольных механизмов, и, надеюсь, вы сможете перенаправить меня в какой-то прекрасный урок. – Akheloes

Смежные вопросы