2016-07-25 10 views
0

При использовании PrettyFaces/Rewrite для перезаписи URL-адресов в приложении JSF и PicketLink для его защиты, 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.

Я знаю, что могу использовать /login как loginPage в PicketLink, но до сих пор я смог использовать 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 для PrettyFaces и через @WebListener для PicketLink.

ответ

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', а Rewrite - в' web-fragment.xml'. Я думаю, что все 'ServletContextListener' обрабатываются первыми (так что PicketLink регистрирует свой фильтр), затем добавляются все другие фильтры из DD (Rewrite). Поэтому заказ не имеет никакого эффекта. Я установил точки останова как для фильтров, так и 'SecurityFilter' инициализирован/привязан до' RewriteFilter'. –

+0

Возможным решением для Rewrite было бы зарегистрировать его фильтр из собственного 'RewriteServletContextListener'. –