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