当使用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
自动注册。
正确!使用绝对顺序来解决这个问题。 – Lincoln
这不起作用:''SecurityFilter'仍然出现在'RewriteFilter'之前。我认为这来自2框架注册其各自的过滤器的方式:PicketLink从它的'PicketLinkServletContextListener'注册它的过滤器,而Rewrite在'web-fragment.xml'中注册它。我认为所有的ServletContextListener都是先处理的(所以PicketLink注册它的过滤器),然后DD的所有其他过滤器被添加(重写)。所以排序在这里没有效果。我已经设置了两个过滤器的断点,'SecurityFilter'在'RewriteFilter'之前被初始化/链接。 –
一个可能的解决方案是让Rewrite从它自己的'RewriteServletContextListener'中注册它的过滤器。 –