结合PrettyFaces和PicketLink

时间:2016-07-25 10:03:13

标签: url-rewriting servlet-filters prettyfaces picketlink

当使用PrettyFaces / Rewrite重写JSF应用程序中的URL和PicketLink来保护它时,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作为登录页面,但是到目前为止,我已经能够以完全透明的方式为我的应用程序使用PrettyFaces / Rewrite(我可以删除它,一切都仍然是工作......但是网址很丑陋。)

我注意到PicketLink的SecurityFilter似乎来自PrettyFaces / Rewrite的RewriteFilter

    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之前?

我没有在部署描述符中声明这些过滤器,它们通过web-fragment.xml为PrettyFaces自动注册,并通过@WebListener为PicketLink自动注册。

1 个答案:

答案 0 :(得分:1)

您可以尝试在web.xml中添加absolute-ordering元素来控制排序。类似的东西:

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