2010-11-11 10 views
11

saludos a todos, estoy usando spring security 3.0.2, urlRewrite 3.1.0 , y tengo un problema con la seguridad de primavera que tengo una regla de que todas las páginas de la aplicación requieren autenticación, excepto algunas páginas para mi seguridad. XML es:Problema de seguridad de primavera con error 404?

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

en el web.xml he definido la página de error

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

y la cuestión es que si yo no soy un usuario conectado, y escrito alguna URL que no lo hace existe en la aplicación como app/notFoundUrl la seguridad de primavera coincide con esta página con el patrón/** que requiere autenticación, por lo que t que el usuario no se redirige a la página de error como se esperaba, pero redirigido a la página de inicio de sesión y después de ella, redirigido a la página de error

y quiero que si el usuario ha escrito una mala url si está conectado o no, él es redirigido a la página de error directamente.

Creo que el problema está relacionado con el web.xml, que aquí está:

<?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> 

alguna idea de cómo solucionar este problema?

Respuesta

6

Usted ha dicho:

quiero que si el usuario ha escrito una mala url si está conectado o no, es redirigido a la página de error directamente

seguridad Primavera interceptará todas las solicitudes antes de saber si su URL es válida o no, entonces una forma de obtenerla sería interceptar todas las URL válidas con algunos patrones, y agregar al final un patrón general al que pueda acceder cualquier persona.

<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" /> 

El problema de esta configuración es que probablemente sea difícil encontrar patrones para todas las URL válidas si su aplicación es compleja.

+1

"En general, es una buena práctica negar el acceso por defecto, en lugar de solo asegurar los recursos que necesitamos". - citado de [Spring Security tutorial] (http://static.springsource.org/spring-security/site/tutorial.html) –

2

Agregue/error a su lista de elementos <intercept-url/> para que no requiera autenticación para poder acceder.

+0

significa simplemente agregar esta regla?

+0

obtuve una excepción de acceso denegado dado que la página que no existe, coincidía con el patrón "/ **" que usa la regla access = "isAhenthenticated () "y en el caso del usuario no registrado, la función es anonyomus, por lo que el usuario se redirige a la página de inicio de sesión –

+0

publicación editada, ¿alguna ayuda? –

3

cuando establece el atributo access="true", le dice a spring-security que verifique si el usuario tiene el atributo de seguridad (que normalmente es un rol) llamado "verdadero". No creo que ese sea tu objetivo?

a eludir la seguridad, puede configurar filters="none" y omita el atributo de acceso: <intercept-url pattern="/errorpage" filters="none" />

ver documentation of <intercept-url>

3

Sí simplemente añadir lo siguiente:

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

Eso hará que sea por lo que cualquiera puede Ve a todas tus páginas de error.

+0

publicación ha sido editada, ¿alguna ayuda? –

Cuestiones relacionadas