2016-07-25 22 views
0

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これはラップ表示されません以前のように

RewriteFilterSecurityFilterの前に付ける方法はありますか?

私は自分のデプロイメント記述子にこれらのフィルタを宣言していませんでしたが、PrettyFacesの場合はweb-fragment.xml、PicketLinkの場合は@WebListener経由で自動的に登録されています。

答えて

1

absolute-ordering要素をweb.xmlに追加して、順序を制御することができます。次のようなもの:

<web-app> 
    ... 
    <absolute-ordering> 
     <name>com_ocpsoft_rewrite</name> 
     <others/> 
    <absolute-ordering> 
    ... 
</web-app> 
+0

正解!これを修正するには絶対順序を使用します。 – Lincoln

+0

これは動作しません: 'SecurityFilter'はまだ' RewriteFilter'の前に来ます。これは、2つのフレームワークがそれぞれのフィルタをどのように登録しているのかと思います.PicketLinkは 'PicketLinkServletContextListener'からフィルタを登録し、' web-fragment.xml'で書き換えを行います。私はすべての 'ServletContextListener'が最初に処理されたと思います(PicketLinkがそのフィルタを登録します)ので、DDからの他のすべてのフィルタが追加されます(Rewrite)。したがって、順序はここで効果がありません。ブレークポイントを両方のフィルタに設定し、 'RewriteFilter'の前に' SecurityFilter'を初期化/連鎖させます。 –

+0

可能な解決策は、Rewriteが自身の 'RewriteServletContextListener'からそのフィルタを登録することです。 –