2012-01-10 26 views
5

Estoy tratando de hacer funcionar mi aplicación spring + hibernate + spring-security y tiles2 - "HelloWorld", siguiendo this guide (desafortunadamente en alemán).j_spring_security_check problema 404

Mi problema es que me aparece un mensaje de error "404" al iniciar sesión en mi aplicación. La redirección a la página de inicio de sesión funciona según lo previsto, pero no puedo acceder al "http://localhost:8080/App/j_spring_security_check" cuando presiono el botón de inicio de sesión.

Mi web.xml se ve de esta manera:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/defs/applicationContext.xml 
     /WEB-INF/defs/applicationContext-security.xml 
    </param-value> 
</context-param> 

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

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 

y applicationContext-security.xml archivo se ve de esta manera ...

<http use-expressions="true"> 
    <intercept-url pattern="/index.html" access="permitAll" /> 
    <intercept-url pattern="/timeout.html" access="permitAll" /> 
    <intercept-url pattern="/redirect.html" access="permitAll" /> 
    <intercept-url pattern="/media/**" access="permitAll" /> 
    <intercept-url pattern="/includes/**" access="permitAll" /> 
    <intercept-url pattern="/office/**" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/office/admin/**" access="hasRole('ROLE_ADMIN')" /> 

    <form-login login-page="/index.html" 
      authentication-failure-url="/index.html?login_error=1" 
      default-target-url='/office/kunden.html' 
      always-use-default-target='true' 
      /> 
    <logout logout-success-url="/index.html" /> 
    <remember-me /> 
    <session-management invalid-session-url="/index.html"> 
     <concurrency-control max-sessions="2" error-if-maximum-exceeded="true" /> 
    </session-management> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <jdbc-user-service data-source-ref="mysqldataSource" 
        authorities-by-username-query="select username, authority from benutzer where username = ?" 
        users-by-username-query="select username, password, enabled from benutzer where username = ?"/> 
    </authentication-provider> 
</authentication-manager> 

La conexión de base parece ser ¡muy bien

Estaría muy contento si alguien pudiera darme una pista sobre eso, porque ya hice muchas búsquedas en Google, pero todavía no encontré una solución.

que usar un muelle 3.1 y Tomcat 7.0.23

+0

¿Se refiere a "j_security_check" o "j_spring_security_check"? Tiene ambos aquí ... –

+0

Lo sentimos, es j_spring_security_check – xSNRG

+0

Compruebe el resultado del registro de depuración para esa solicitud y vea qué dice Spring Security sobre su procesamiento. Debería ver un informe detallado de su paso por la cadena de filtros. –

Respuesta

0

Su configuración se ve bien. Una cosa que puede presentar caso el 404 es si el default-target-url='/office/kunden.html' apunta a un controlador o vista que no existe.

Compruebe que la url /office/kunden.html funciona - por lo tanto, desactive la seguridad (simplemente agregue <security:intercept-url pattern="/**" access="permitAll" />) y pruébelo.

Otra cosa que puede salir mal es que el tutorial es para la primavera 3.0 pero no para la primavera 3.0. No esperaría que esta sea la causa, pero pruébalo y descárgalo.

+0

Eso es lo que hice primero, apague las restricciones de seguridad. Mismo problema. Quizás tengas razón y la degradación ayuda. – xSNRG

+0

¿Puede aclarar exactamente qué solicitud está causando el 404? Debería poder resolverlo desde el registro y monitoreando las solicitudes enviadas por su navegador (por ejemplo, usando Firebug). –

+0

@xSNRG: Si el mismo problema ocurre sin la seguridad de primavera, entonces el problema está relacionado con el controlador o la vista 'kunden'. - ¿Implementaste el tutoral hasta el final, porque parece que el controlador 'kunden' se implementa después de las cosas de seguridad? – Ralph

2

Me gustaría comprobar dos cosas:

  1. Solicitud de expedición
  2. config Primavera-seguridad

Para comprobar la petición del envío solo asegúrese de que su aplicación es accesible en el contenedor de servlets en El primer lugar. Es decir, has mencionado http://localhost:8080/App/j_spring_security_check. ¿Su aplicación es accesible bajo esa URL? ¿Muestra http://localhost:8080/App contenido adecuado (HTTP 200)? También asegúrese de que el servlet despachador esté configurado correctamente. En el tutorial que nos ha proporcionado, existe esta sección:

<!-- Spring Hauptteil --> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

Si no se ha proporcionado en su web.xml, a continuación, su solicitud podría ni siquiera ser enviado correctamente antes de que acabe siendo examinada a través de resorte de seguridad.

Si esto no te sirve, intenta esto.

Según documentation, la configuración mínima debería ser suficiente para verificar si su configuración es correcta. Si ha seguido el tutorial, podría cometer un pequeño error (typeo, por ejemplo) que hará que la seguridad de la primavera no se inicie correctamente. Entonces es fácil omitir alguna información de error en la salida del registrador. Te sugiero que hagas lo siguiente.

  1. Cambie su applicationContext-security.xml para admitir la configuración mínima incluida en la documentación.
  2. iniciar la aplicación y vaya a http://localhost:8080/App/j_spring_security_check

Si obtiene una respuesta adecuada - intente modificar configuración hasta que haya terminado.

punto de aprender Lo DelegatingFilterProxy (definido en web.xml) que realmente hace es delegar la petición a algún otro filtro administrado por la COI de la primavera. Este filtro se está definiendo en applicationContext-security a través del espacio de nombres de seguridad. Si esto no funciona por alguna razón, el filtro no se inicializará, y puede terminar viendo http 404 independientemente del hecho de que el resto de la aplicación se inicie correctamente.

Uffff, gran cantidad de texto;)

0

Para aquellas personas que se enfrentan a los mismos síntomas, pero para una situación diferente, los que están detrás de un equilibrador de carga que hace la descarga de SSL, la siguiente respuesta podría poner en el dirección correcta. Tenía un problema similar y resultó que la solicitud entrante se manejó correcto, sin embargo como una garantía de primavera respuesta envía una redirección a una URL absoluta, que se define por el atributo default-target-url (comenzando con http en lugar de https)

<security:form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true" /> 

Ahora el navegador del cliente intenta abrir la ubicación redirigida en http, falla en el equilibrador de carga (que sólo acepta tráfico HTTPS) y reporta un 404 NOT FOUND

Hemos resuelto este problema mediante la adición de la mod_header directiva siguiente para todas las peticiones entrantes en el puerto 443 (https) en el equilibrador de carga:

RequestHeader set X-Forwarded-Proto "https"

Agregarán un encabezado adicional. Si ejecuta un servidor de aplicaciones como Jetty, reconocerá este encabezado y traducirá la solicitud entrante. (Consulte http://www.gossamer-threads.com/lists/apache/users/407272)