PrettyFaces/Rewriteを使用してJSFアプリケーションとPicketLinkでURLを書き換えて保護する場合、PicketLinkは書き換えルールを使用していないようです。例えばPrettyFacesとPicketLinkの結合
、私はこのようなものでPicketLinkを設定する場合:
builder
.http()
.allPaths()
.authenticateWith()
.form()
.loginPage("/common/login.xhtml")
そして、このような書き換えルールがあります。ユーザーは/common/login.xhtml
代わりの/login
にリダイレクトされます
<url-mapping id="login">
<pattern value="/login" />
<view-id value="/common/login.xhtml" />
</url-mapping>
を。
私はPicketLinkのloginPageとして/login
を使用できると知っていますが、今まで私はアプリケーションのために完全に透過的な方法でPrettyFaces/Rewriteを使用することができました(私はそれを取り除くことができ、しかし醜いURLで)。
私はPicketLinkからSecurityFilter
が書き換え/ PrettyFacesから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はencodeRedirectUrl()
を上書きするために何とかHttpServletResponse
をラップしている場合、SecurityFilter
これはラップ表示されません以前のように
RewriteFilter
をSecurityFilter
の前に付ける方法はありますか?
私は自分のデプロイメント記述子にこれらのフィルタを宣言していませんでしたが、PrettyFacesの場合はweb-fragment.xml
、PicketLinkの場合は@WebListener
経由で自動的に登録されています。
正解!これを修正するには絶対順序を使用します。 – Lincoln
これは動作しません: 'SecurityFilter'はまだ' RewriteFilter'の前に来ます。これは、2つのフレームワークがそれぞれのフィルタをどのように登録しているのかと思います.PicketLinkは 'PicketLinkServletContextListener'からフィルタを登録し、' web-fragment.xml'で書き換えを行います。私はすべての 'ServletContextListener'が最初に処理されたと思います(PicketLinkがそのフィルタを登録します)ので、DDからの他のすべてのフィルタが追加されます(Rewrite)。したがって、順序はここで効果がありません。ブレークポイントを両方のフィルタに設定し、 'RewriteFilter'の前に' SecurityFilter'を初期化/連鎖させます。 –
可能な解決策は、Rewriteが自身の 'RewriteServletContextListener'からそのフィルタを登録することです。 –