2012-04-17 4 views
2

мой web.xml:Welcome файл игнорирует ограничения безопасности

<context-param> 
      <param-name>javax.faces.PROJECT_STAGE</param-name> 
      <param-value>Development</param-value> 
     </context-param> 

     <welcome-file-list> 
      <welcome-file>/secured/secure.xhtml</welcome-file> 
     </welcome-file-list> 

     <servlet> 
      <servlet-name>Faces Servlet</servlet-name> 
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
      <load-on-startup>1</load-on-startup> 
     </servlet> 

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

     <context-param> 
      <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
      <param-value>true</param-value> 
     </context-param> 
    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>Restricted</web-resource-name> 
      <url-pattern>/secured/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>ADMIN</role-name> 
     </auth-constraint> 
     </security-constraint> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>jdbc-realm</realm-name> 
    <form-login-config> 
     <form-login-page>/public/login.xhtml</form-login-page> 
     <form-error-page>/public/error.xhtml</form-error-page> 
    </form-login-config> 
    </login-config> 

Я хочу, чтобы мой веб-приложение, чтобы перенаправить неавторизованных пользователей Логин страницу. Самое смешное, что у меня была эта работа, но я сделал некоторые глупые изменения, и теперь при доступе к localhost:8080 я всегда вижу secure.xhtml, даже когда он не вошел в систему. localhost:8080/secured/secure.xhtml перенаправляет штраф.

ответ

7

Вы не используете <welcome-file> полностью правильно. Он должен представлять единственное имя файла, который должен быть подан всякий раз, когда запрашивается папка, независимо от запрошенной папки (корень / или /public/ или /secured/ и т. Д.).

Файл приветствия обслуживается внутренним переадресатором в соответствии с RequestDispatcher#forward(). Внутренние форварды do не запускают ограничения безопасности. Вместо этого вам нужно отправить перенаправление.

Измените <welcome-file> на более нормальное значение по умолчанию, например. index.xhtml.

<welcome-file-list> 
    <welcome-file>index.xhtml</welcome-file> 
</welcome-file-list> 

И создать в корне WebAPP как /index.xhtml. Если вам нужно перенаправить каждый запрос на /index.xhtml к /secured/secure.xhtml, то есть в основном 2 способа:

  1. Карта A Filter по шаблону URL из /index.xhtml и называют response.sendRedirect("secured/secure.xhtml") внутри метода doFilter(). Например.

    @WebFilter("/index.xhtml") 
    public class IndexFilter implements Filter { 
    
        @Override 
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
         HttpServletResponse response = (HttpServletResponse) res; 
         response.sendRedirect("secured/secure.xhtml")); 
        } 
    
        // ... 
    } 
    
  2. Поместите <f:event type="preRenderView"> в /index.xhtml, который вызывает метод боб подложки, которая в свою очередь, делает externalContext.redirect("secured/secure.xhtml"). Например.

    <f:event type="preRenderView" listener="#{indexBean.redirect}" /> 
    

    с

    @ManagedBean 
    @ApplicationScoped 
    public class IndexBean { 
    
        public void redirect() throws IOException { 
         FacesContext.getCurrentInstance().getExternalContext().redirect("secured/secure.xhtml"); 
        } 
    
    } 
    
+0

Вау спасибо! Но как насчет проверки входа пользователя в систему? Должен ли я делать это в одном фильтре? Можно ли отнять это у контейнера? –

+2

'' уже делает это. Вам не нужно делать это самостоятельно. Единственным моментом является то, что вам нужно выполнить перенаправление вместо прямого. Перенаправление создает новый запрос, который затем снова запускает ограничения безопасности с новым URL-адресом. Для пересылки слишком поздно, потому что ограничения безопасности уже * были протестированы на основе начального URL-адреса '/', который по вашей конфигурации является общедоступным без ограничений. – BalusC

+0

У меня проблема с фильтром. Он швы, если у меня есть фильтр «security-constraint», который не вызывается, если я закомментирую «ограничение», он начинает работать. Может быть, потому, что они перекрываются на/secure/* страницах? Сервер - стеклянная рыба 3.1. Пожалуйста, если у вас есть время, помогите мне. –