当使用 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
.
我知道我可以/login
在 PicketLink 中用作 loginPage,但是直到现在,我已经能够以完全透明的方式为我的应用程序使用 PrettyFaces/Rewrite(我可以删除它,一切仍然可以工作......但是 URL 很丑陋)。
我注意到SecurityFilter
来自 PicketLink 的似乎出现在RewriteFilter
来自 PrettyFaces/Rewrite 之前:
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
for PrettyFaces 和一个@WebListener
for PicketLink 自动注册的。