代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

404错误的弹簧安全问题?

  •  11
  • Mahmoud Saleh  · 技术社区  · 14 年前

    大家好,我使用的是SpringSecurity3.0.2,URLRrewrite 3.1.0

    <http use-expressions="true" > 
    <intercept-url pattern="/" access="permitAll" />
    <intercept-url pattern="/error"  filter="none" />  
    <intercept-url pattern="/**" access="isAuthenticated()" />
    .
    .
    .</http>
    

    在web.xml中,我定义了错误页

    <error-page>
       <error-code>404</error-code>
       <location>/p/error</location>
    </error-page>
    

    问题是,如果我不是一个登录用户,输入了一些应用程序中不存在的URL,比如App/NoDuffurl,Spring Security将这个页面匹配到需要认证的模式/**,这样用户就不会像预期那样重定向到错误页面,而是重定向到登录页面并在它之后重定向到错误页面。

    如果用户输入了一个错误的url,不管他是否登录,他都会直接重定向到错误页面。

    我认为问题与web.xml有关,这里是:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
        <!-- Beans in these files will makeup the configuration of the root web application context -->
        <!-- Bootstraps the root web application context before servlet initialization-->
        <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- Deploys the 'projects' dispatcher servlet whose configuration resides in /WEB-INF/servlet-config.xml-->
        <servlet>
            <servlet-name>p</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>
                /WEB-INF/servlet-config.xml         
                </param-value>
            </init-param>
        </servlet>
    
        <!-- Maps all /p URLs to the 'p' servlet -->
        <servlet-mapping>
            <servlet-name>p</servlet-name>
            <url-pattern>/p/*</url-pattern>
        </servlet-mapping>
    
       <error-page>
       <error-code>404</error-code>
       <location>/p/error</location>
       </error-page>
    
    
       <!-- force encoding on the requests -->
       <filter>
        <filter-name>encoding-filter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encoding-filter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
      </filter-mapping>
    
        <filter>
            <filter-name>springSecurityFilterChain</filter-name>
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>springSecurityFilterChain</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    
    
       <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    
      </filter>
      <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
    
    
    
    
        <!-- Security -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
          /WEB-INF/application-config.xml
          /WEB-INF/app-security.xml
          /WEB-INF/mvc-config.xml
        </param-value>
        </context-param>
    
    
        <session-config>
          <session-timeout>1</session-timeout> 
        </session-config>
    
    
    </web-app>
    

    有什么办法解决这个问题吗?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Javi    14 年前

    你说过:

    Spring security将在知道其url是否有效之前截获每个请求,因此获得它的方法是截获具有某些模式的所有有效url,并在最后添加一个任何人都可以访问的通用模式。

    <intercept-url pattern="/" access="permitAll" />
    <intercept-url pattern="/validUrl1Pattern"  access="permitAll" />  
    <intercept-url pattern="/validUrl2Pattern"  access="permitAll" />  
    <intercept-url pattern="/validUrl2Pattern"  access="permitAll" />  
    ...
    <intercept-url pattern="/**" access="ROLE_ANONYMOUS" />
    

        2
  •  3
  •   Grant Cermak    14 年前

    是的,加上这个:

    <intercept-url pattern="/error/**" access="permitAll" />
    

    这样任何人都可以看到你所有的错误页面。

        3
  •  3
  •   Eliran Malka    12 年前

    access="true" ,告诉spring security检查用户是否具有名为“true”的安全属性(通常是一个角色)。我不认为这是你的目标?

    filters="none" 并跳过access属性: <intercept-url pattern="/errorpage" filters="none" />

    看见 documentation of <intercept-url>

        4
  •  2
  •   Alex Marshall    14 年前

    <intercept-url/> 元素,以便它不需要身份验证才能访问它。