【发布时间】:2016-11-28 14:55:13
【问题描述】:
当使用 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 作为 loginPage,但是直到现在,我已经能够以一种完全透明的方式为我的应用程序使用 PrettyFaces/Rewrite(我可以删除它,一切仍然可以正常工作。 .. 但 URL 很丑)。
我注意到来自 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 自动注册的。
【问题讨论】:
标签: url-rewriting servlet-filters prettyfaces picketlink