2016-07-25 28 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'中注册它的过滤器。 –