當使用PrettyFaces/Rewrite重寫JSF應用程序和PicketLink中的URL以保護它時,PicketLink似乎不使用重寫規則。結合PrettyFaces和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
似乎來的RewriteFilter
從PrettyFaces前/改寫:
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
之前?
我沒有在我的部署描述符中聲明這些過濾器,它們通過PrettyFaces的web-fragment.xml
和PicketLink的@WebListener
自動註冊。
正確!使用絕對順序來解決這個問題。 – Lincoln
這不起作用:''SecurityFilter'仍然出現在'RewriteFilter'之前。我認爲這來自2框架註冊其各自的過濾器的方式:PicketLink從它的'PicketLinkServletContextListener'註冊它的過濾器,而Rewrite在'web-fragment.xml'中註冊它。我認爲所有的ServletContextListener都是先處理的(所以PicketLink註冊它的過濾器),然後DD的所有其他過濾器被添加(重寫)。所以排序在這裏沒有效果。我已經設置了兩個過濾器的斷點,'SecurityFilter'在'RewriteFilter'之前被初始化/鏈接。 –
一個可能的解決方案是讓Rewrite從它自己的'RewriteServletContextListener'中註冊它的過濾器。 –