2011-12-01 3 views
3

짧은 질문. 선언적 보안 검사를 수행하기 전에 서블릿 필터를 어떻게 실행시킬 수 있습니까?선언적 보안 검사보다 서블릿 필터 (자동 로그인) 우선 순위

긴 질문. 내 웹 응용 프로그램의 경우 서버 선언적 보안을 사용하여 모든 보안 요구 사항을 관리하려고합니다. <url-pattern>/secure/*</url-pattern>에 보안 제한을 설정하고 <auth-method>FORM</auth-method><form-login-page>/sign-in.xhtml</form-login-page>으로 설정했습니다.

(쿠키 기반) "remember me"기능을 제공하기 위해 각 요청을 차단하고 사용자가 로그인되어 있지 않은지 확인한 후 자동으로 로그인 할 수 있는지 확인합니다. 쿠키)는 결국 서블릿 기반 로그인을 사용하여 로그인합니다.

<filter-mapping> 
    <filter-name>CustomLoginFilter</filter-name> 
    <url-pattern>*.xhtml</url-pattern> 
</filter-mapping> 

이제 사용자가 브라우저를 열고 mysite.com에 연결하면 모든 것이 올바르게 작동합니다. 사용자가 자신의 브라우저를 열고 난 다음 동작을 관찰 mysite.com/secure/secret.xhtml 같은 직선로 요청하게한다면 :

  1. GET
  2. 로그 in.xhtml의 지원 콩 /secure/secret.xhtml을 인스턴스화 (FacesContext이 분명히 모든 과정을 방해 (FacesContext가 NULL)

,

  • CustomLoginFilter.doFilter()가 호출되는) 사용할 수 있습니다. "declarative security filter"(또는 무엇이든)를 통해 내 CustomLoginFilter에 우선권을 줄 수있는 방법을 찾을 수 없습니다. 선언의 web.xml 순서를 변경해도 아무런 도움이되지 않습니까? 고맙습니다!

  • 답변

    3

    선언적 보안 검사를 수행하기 전에 서블릿 필터를 어떻게 실행할 수 있습니까?

    사양 및 보안 제한으로 인해 불가능합니다.

    가장 좋은 방법은 로그인 페이지에 preRenderView 이벤트를 연결하고 새로운 서블릿 3.0 HttpServletRequest#login() 메소드를 사용하여 프로그래밍 방식으로 로그인하는 것입니다.

    예.

    public void checkAutoLogin() throws IOException { 
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
        Cookie autoLogin = externalContext.getRequestCookieMap().get("autoLoginCookieName"); 
    
        if (autoLogin != null) { 
         User user = decryptCookieValueAndExtractUser(autoLogin.getValue()); // Yes, it must be encrypted! Otherwise a too easy hack. 
    
         if (user != null) { 
          HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); 
    
          try { 
           request.login(user.getName(), user.getPassword()); 
           String originalRequestURI = externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
           externalContext.redirect(originalRequestURI != null ? originalRequestURI : "someDefaultIndex.xhtml"); 
          } catch (ServletException e) { 
           // Login failed. It's up to you how to handle it. 
          } 
         } 
        } 
    } 
    
    +0

    예,'HttpServletRequest의 # 로그인()가'이미 기본 로그인 방법입니다 같은 뭔가

    <f:event type="preRenderView" listener="#{authenticator.checkAutoLogin}" /> 

    . 고맙습니다. 좋은 제안입니다. 제한 사항을 우회하는 유일한 방법 일 수 있습니다. * 그리고 저는 개인적으로 모든 질의 응답과 기사에 대해 감사드립니다. (나는 지난 주에 이미 많은 것을 배웠습니다!) * – Fabio

    +0

    환영합니다 :) – BalusC