Url rewriting 将漂亮的脸和PicketLink结合起来
在JSF应用程序中使用PrettyFaces/Rewrite重写URL并使用PicketLink保护URL时,PicketLink似乎没有使用重写规则 例如,如果我使用以下内容配置PicketLink:Url rewriting 将漂亮的脸和PicketLink结合起来,url-rewriting,servlet-filters,prettyfaces,picketlink,Url Rewriting,Servlet Filters,Prettyfaces,Picketlink,在JSF应用程序中使用PrettyFaces/Rewrite重写URL并使用PicketLink保护URL时,PicketLink似乎没有使用重写规则 例如,如果我使用以下内容配置PicketLink: builder .http() .allPaths() .authenticateWith() .form() .loginPage("/common/login.xhtml"
builder
.http()
.allPaths()
.authenticateWith()
.form()
.loginPage("/common/login.xhtml")
<url-mapping id="login">
<pattern value="/login" />
<view-id value="/common/login.xhtml" />
</url-mapping>
有这样一个重写规则:
builder
.http()
.allPaths()
.authenticateWith()
.form()
.loginPage("/common/login.xhtml")
<url-mapping id="login">
<pattern value="/login" />
<view-id value="/common/login.xhtml" />
</url-mapping>
因此,如果PrettyFaces正在以某种方式包装HttpServletResponse
以覆盖encodeRedirectUrl()
,那么SecurityFilter
将不会像以前一样看到此包装的响应
有没有办法使重写过滤器
位于安全过滤器
之前
我没有在部署描述符中声明这些过滤器,它们是通过
web fragment.xml
为PrettyFaces自动注册的,通过@WebListener
为PicketLink自动注册的。您可以尝试向web.xml添加绝对排序
元素来控制排序。比如:
<web-app>
...
<absolute-ordering>
<name>com_ocpsoft_rewrite</name>
<others/>
<absolute-ordering>
...
</web-app>
...
com_ocpsoft_重写
...
正确!使用绝对顺序修复此问题。这不起作用:SecurityFilter
仍然位于RewriteFilter
之前。我认为这来自于两个框架如何注册各自的过滤器:PicketLink从其PicketLink ServletContextListener
注册其过滤器,而Rewrite则在web fragment.xml
中注册。我认为首先处理所有的ServletContextListener
s(因此PicketLink注册其过滤器),然后添加来自DDs的所有其他过滤器(重写)。因此,在这里,订购没有效果。我已经设置了两个过滤器的断点,SecurityFilter
在RewriteFilter
之前被初始化/链接。一个可能的解决方案是Rewrite从自己的RewriteServletContextListener
注册它的过滤器。我通过在web.xml
中声明这两个过滤器,以正确的顺序获得了过滤器或者在自定义的web fragment.xml
中,它的绝对顺序为#1。不幸的是,这并不能解决我的问题:当PicketLink重定向到登录页面时,url没有被重写,因此这可能是PicketLink中的问题(不使用encodeRedirectURL()
?)。问题可能来自org.PicketLink.http.internal.authentication.schemes.FormAuthenticationScheme.forwardToLoginPage()
,在重定向之前不会对URL进行编码。