2016-07-25 6 views
0

PrettyFaces/Rewrite를 사용하여 JSF 응용 프로그램과 PicketLink에서 URL을 다시 작성하여 보호하려면 PicketLink가 다시 쓰기 규칙을 사용하지 않는 것 같습니다. 예를 들어PrettyFaces와 PicketLink 결합

, 나는 이런 식으로 뭔가에 PicketLink를 구성하는 경우 :

builder 
    .http() 
     .allPaths() 
      .authenticateWith() 
       .form() 
        .loginPage("/common/login.xhtml") 

그리고 이런 재 작성 규칙이 있습니다

<url-mapping id="login"> 
    <pattern value="/login" /> 
    <view-id value="/common/login.xhtml" /> 
</url-mapping> 

는 사용자가 /common/login.xhtml 대신 /login로 리디렉션됩니다.

PicketLink에서 loginPage로 /login을 사용할 수 있다는 것을 알고 있지만, 지금까지는 내 응용 프로그램에 대해 완전히 투명한 방식으로 PrettyFaces/Rewrite를 사용할 수있었습니다 (제거하고 모든 것이 여전히 작동 할 수 있습니다 ..). 하지만 추한 URL로). PrettyFaces가 encodeRedirectUrl()를 대체 어떻게 든 HttpServletResponse 포장되는 경우 SecurityFilter이 감싸 표시되지 않습니다,

at org.ocpsoft.rewrite.servlet.impl.HttpRewriteResultHandler.handleResult(HttpRewriteResultHandler.java:41) 
    at org.ocpsoft.rewrite.servlet.RewriteFilter.rewrite(RewriteFilter.java:268) 
    at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:188) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) 
    at org.picketlink.http.internal.SecurityFilter.processRequest(SecurityFilter.java:346) 
    at org.picketlink.http.internal.SecurityFilter.performOutboundProcessing(SecurityFilter.java:237) 
    at org.picketlink.http.internal.SecurityFilter.doFilter(SecurityFilter.java:196) 

그래서 :

나는 PicketLink에서 SecurityFilter가 다시 작성/PrettyFaces에서 RewriteFilter 전에 올 것 같다 것으로 나타났습니다 응답은 이전과 같습니다.

SecurityFilter 앞에 RewriteFilter이 올 수있는 방법이 있습니까?

배포 설명자에 해당 필터를 선언하지 않았지만 PrettyFaces의 경우 web-fragment.xml을 통해 그리고 PicketLink의 경우 @WebListener을 통해 자동으로 등록되었습니다.

답변

1

absolute-ordering 요소를 web.xml에 추가하여 순서를 제어 할 수 있습니다. 다음과 같음 :

<web-app> 
    ... 
    <absolute-ordering> 
     <name>com_ocpsoft_rewrite</name> 
     <others/> 
    <absolute-ordering> 
    ... 
</web-app> 
+0

맞음! 이 문제를 해결하려면 절대 순서 지정을 사용하십시오. – Lincoln

+0

이것은 작동하지 않습니다 :'SecurityFilter'는 여전히'RewriteFilter' 전에옵니다. 필자는 이것이 2 개의 프레임 워크가 각각의 필터를 등록하는 방법에서 나온 것이라고 생각합니다. PicketLink는'PicketLinkServletContextListener'에서 필터를 등록하고 Rewrite는'web-fragment.xml'에서 필터를 등록합니다. 모든'ServletContextListener'가 먼저 처리되었으므로 (PicketLink가 필터를 등록합니다), DD의 다른 모든 필터가 추가됩니다 (재 작성). 따라서 주문은 여기에 영향을 미치지 않습니다. 중단 점을 두 필터로 설정하고'SecurityFilter'는'RewriteFilter' 전에 초기화/연결됩니다. –

+0

가능한 해결책은 Rewrite가 자체 RewriteServletContextListener에서 필터를 등록하는 것입니다. –