当使用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自动注册。
答案 0 :(得分:1)
您可以尝试在web.xml中添加absolute-ordering
元素来控制排序。类似的东西:
<web-app>
...
<absolute-ordering>
<name>com_ocpsoft_rewrite</name>
<others/>
<absolute-ordering>
...
</web-app>