2016-07-25 108 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中使用/login作爲loginPage,但直到現在,我已經能夠以完全透明的方式爲我的應用程序使用PrettyFaces/Rewrite(我可以刪除它,並且所有東西仍然可以正常工作..但帶有醜陋的URL)。

我注意到,從PicketLink的SecurityFilter似乎來的RewriteFilter從PrettyFaces前/改寫:

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) 

所以,如果PrettyFaces被包裹HttpServletResponse莫名其妙覆蓋encodeRedirectUrl(),該SecurityFilter不會看到這個包迴應如前所述。

有沒有辦法讓RewriteFilter出現在SecurityFilter之前?

我沒有在我的部署描述符中聲明這些過濾器,它們通過PrettyFaces的web-fragment.xml和PicketLink的@WebListener自動註冊。

回答

1

您可以嘗試在您的web.xml中添加absolute-ordering元素來控制排序。例如:

<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'中註冊它的過濾器。 –