JSF и PrettyFaces - Как ограничить прямые запросы xhtml

Я новичок в JSF и PrettyFaces. Итак, теперь я обнаружил, что могу настроить PrettyFaces для "пересылки" запроса в нужный файл.xhtml. Проблема в том, что я (или пользователь, если он знает структуру моей папки) также может запросить файл. Это мой образец:

Файлы: webbapp/mypage.xhtml

Я добавил следующие строки в pretty-config.xml:

<url-mapping id="myPageId">
    <pattern value="/prettyurltomypage" />
    <view-id value="/mypage.xhtml" /> 
</url-mapping>

Фильтр PrettyFaces настроен на перехват "/ ". Фронт-контроллер Faces настроен на обработку всех запросов ".xhtml". Когда я прошу...

http://localhost:8080/myapp/prettyurltomypage

... все хорошо. Моя проблема в том, что я могу также запросить...

http://localhost:8080/myapp/mypage.xhtml

Как я могу ограничить запросы.xhtml? Моя цель - заставить jsf/server доставить страницу 404 по умолчанию.

Мое решение (до сих пор) было определить правило перезаписи в pretty-config.xml:

<rewrite match="/mypage.xhtml" substitute="/prettyurltomypage" redirect="301" />

Есть ли другой (более умный) способ?

3 ответа

Решение

Это можно сделать, помечая файлы XHTML как веб-ресурсы в дескрипторе развертывания.
Для этого вы можете добавить что-то вроде этого в ваш web.xml:

<security-constraint>
    <display-name>Restrict direct access to XHTML files</display-name>
    <web-resource-collection>
        <web-resource-name>XHTML files</web-resource-name>
        <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

Если вы хотите узнать больше об ограничениях безопасности, есть небольшая статья о Javalobby.

Да, если вы просто хотите заблокировать доступ к прямым страницам, возможно, это лучший способ без использования чего-то вроде специального пакета безопасности - в противном случае, если вы просто хотите убедиться, что страницы отображаются правильно. На самом деле вы можете просто изменить отображение сервлета лица на.xhtml, что означает, что ваш источник не будет отображаться при доступе людей к страницам.

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>

Если вы хотите выполнить более сложные правила перезаписи, чтобы фактически заблокировать страницы, вы можете рассмотреть возможность использования собственного процессора перезаписи и реализации интерфейса процессора.

http://ocpsoft.com/docs/prettyfaces/3.3.0/en-US/html_single/

Пользовательские процессоры имеют доступ к HttpServletRequest и HttpServletResponse и вызывают как при входящей, так и при исходящей перезаписи: с помощью этого интерфейса вы можете делать более сложные вещи:

/**
 * Perform a rewrite operation on a given URL, utilizing any necessary information from the given {@link RewriteRule}
 * configuration object from which the processor was invoked.
 * 
 * @author Lincoln Baxter, III <lincoln@ocpsoft.com>
 */
public interface Processor
{
   /**
    * Process an inbound URL Rewrite request. This takes place when the request first comes in to the server and passes
    * through {@link RewriteFilter}
    */
   String processInbound(HttpServletRequest request, HttpServletResponse response, RewriteRule rule, String url);

   /**
    * Process an outbound URL Rewrite request. This takes place when a URL is passed in to
    * {@link HttpServletResponse#encodeRedirectURL(String)}, and since most frameworks ensure the call to
    * 'encodeRedirectUrl()' occurs automatically, can be assumed to occur whenever a URL would be rendered to HTML
    * output.
    */
   String processOutbound(HttpServletRequest request, HttpServletResponse response, RewriteRule rule, String url);
}

В противном случае то, что вы делаете, будет работать, и до тех пор, пока OCPSoft Rewrite https://github.com/ocpsoft/rewrite (который также стоит за PrettyFaces) не будет выпущен, и в этом случае вы можете сделать это довольно легко с помощью простого правила входящей перезаписи:

package com.example;
public class ExampleConfigurationProvider extends HttpConfigurationProvider
{

   @Override
   public int priority()
   {
     return 10;
   }

   @Override
   public Configuration getConfiguration(final ServletContext context)
   {
     return ConfigurationBuilder.begin()
       .defineRule()
         .when(Direction.isInbound().and(DispatchType.isRequest()).and(Path.matches(".*\\.xhtml")).andNot(Path.matches(".*javax.faces.resource.*")))
         .perform(SendStatus.code(404));
    }
}

Это правило перезаписи блокирует доступ к входящим HTTP-запросам в файлах.XHTML, но разрешает пересылку или ошибочные или асинхронные запросы. Он также оставит API ресурсов JSF2 в функциональном состоянии, что не так, если вы используете ограничение безопасности Java EE, как предлагается в другом ответе.

Надеюсь, это поможет, Линкольн

Смотрите следующую проблему: http://code.google.com/p/prettyfaces/issues/detail?id=116

Надеюсь, что это поможет вам

Другие вопросы по тегам