2013-05-20 6 views
1

내 질문과 비슷한 질문이 많았습니다. 이해하지 못하면 깨닫지 못해서야 깨닫기 시작했습니다.Homegrown 인증 필터에 시작 페이지가 표시되지 않음

인증 빈에서는 인증 성공으로 인해 일부 웹 리소스에 액세스해야하며 실패는 액세스를 "필터링"하고 현재 로그인 페이지로 리디렉션해야합니다. 나는 실패의 경우

public static final String AUTH_STATE = ""; 

를 다음을 수행하십시오으로 콩에 정의되어

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

AUTH_STATE : 지금, 그위한 인증 콩, 나는 성공의 경우에이 라인을 추가 :

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

이제 필터 (인증 페이지를 제외한 모든 파일에 적용되는 필터)에서 내 doFilter m ethod은 다음과 같습니다

위한 인증이 잘 가면 내 생각이의 authentificationBean1.AUTH_STATE 세션 attribut가 null이 아닌 값으로 설정 될 것을
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"); 
     } 

    } 

, 따라서 필터 테스트에서 내가로 리디렉션 할 수 있습니다 웰컴 페이지 (accueil.xhtml); 해당 속성이 null 인 경우 인증 페이지에 머물러 있습니다.

모든 것을 맛보기 : 필터가 작동하는 것처럼 보이지만 인증 테스트가 성공해야하는 경우에도 환영 페이지로 넘어 가지 않습니다. 실제로 필터 없이는 제대로 작동했지만, JSF로 필터를 사용하거나 필터로 사용하지 못하는 것 같습니다.

P.S : 다른 필터를 호출 할 필요가 없기 때문에 chain.doFilter가 적용되지 않았지만 거기에 무엇인가 의심됩니다.

귀하의 지적에 감사드립니다.

편집 :

<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 인 경우 계정에 반영되지 않습니다. 그렇지 않으면 필터가 othercase에서 작동합니다 (** AUTH_STATE **가 null이 아닙니다. – Akheloes

답변

3

귀하의 필터는 매번 그 자체로 리디렉션, 무한 루프에서 실행됩니다. 그것은 결코 서블릿에 대한 요청을 계속하지 않습니다. HTTP가 어떻게 작동하는지 오해 한 것 같습니다. response.sendRedirect()을 사용하면 기본적으로 새로운 HTTP 요청을 시작합니다. 이 새로운 새로운 HTTP 요청은 필터를 다시 호출합니다. 따라서 필터가 accueil.xhtml으로 리디렉션하기 위해 조건과 일치하면 무한 루프에서 해당 페이지로 계속 리디렉션되고 요청을 처리하기 위해 서블릿을 계속 사용하지 않습니다.

또한 chain.doFilter()의 의미를 잘못 이해했습니다. 명시 적으로 다음 필터로 진행하지는 않습니다. 은 필터가없는 것처럼 계속 요청을 계속합니다. 체인에 다음 필터가 있는지 여부는 완전히 관련이 없습니다. 필터가 없다면 대상 서블릿 (JSF 페이지 처리 책임자 인 케이스의 FacesServlet)에서 끝납니다.

기본적으로되어야 흐름은 다음과 같다 : 사용자가 다음에 기록되지

  • 경우
    • 를 현재 요청 된 페이지가 다음 리디렉션하지 authentification.xhtml 경우.
    • 현재 요청한 페이지가 이미 authentification.xhtml 인 경우 계속 요청하십시오.
  • 사용자가 로그인 한 경우 요청한 페이지에 관계없이 요청을 계속하십시오.

이 그것을 수행해야합니다 나는 또한 JSF 리소스에 체크를합니다 (CSS/JS/이미지 파일 <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

무한 루프, 그 중 하나는 상상조차하지 않았습니다 ... 그래서 필터가 "filtred"ressource에 액세스하려고 할 때마다 실행됩니다. , 권리 ? – Akheloes

+0

URL 패턴과 일치하는 모든 HTTP 요청에서 필터가 호출됩니다. 리디렉션은 클라이언트에게 새로운 HTTP 요청을 생성하도록 지시합니다. 기본적으로 필터는 클라이언트에게 새로운 HTTP 요청을 생성하도록 지시합니다. – BalusC

+0

예를 들어 필자는 필자의 필터를 accueil.xhtml에 매핑했습니다. 즉, 해당 페이지를 호출 할 때마다 필터가 "doFiltre"에 개입 할 것임을 의미합니까? 죄송합니다. 몇 가지 기사를 읽으십시오.하지만 언더 그라운드 메커니즘이 없으면 코드를 표시하는 것처럼 보입니다. 잘하면 몇 가지 훌륭한 자습서로 리디렉션 할 수 있습니다. – Akheloes

관련 문제