2011-03-22 14 views
14

Necesito modificar mi página de inicio de sesión de seguridad de primavera según el origen del usuario. Mi cliente quiere que los estilos sean diferentes entre los dos. Si vienes de appcontextroot/test vs appcontextroot/choose. Intenté hacer lo siguiente pero el String url=savedRequest.getRedirectUrl(); es igual a la página de inicio de sesión de primavera y no a la página inicial solicitada por el usuario. ¿Algunas ideas?Seguridad de primavera 3 Obtener URL solicitada inicialmente

ExternalContext externalContext = FacesUtils.getExternalContext(); 
    HttpServletRequest request = (HttpServletRequest)externalContext.getRequest(); 
    HttpSession session = request.getSession(false); 
    if(session != null) { 
     SavedRequest savedRequest = new DefaultSavedRequest(request, new PortResolverImpl()); 
     String url=savedRequest.getRedirectUrl(); 
    } 
+0

Creo que debe crear dos páginas de inicio de sesión diferentes, con el filtro correspondiente. –

+0

Alois, gracias por responder, ¿conoces algún ejemplo de cómo hacerlo? Soy nuevo en la seguridad de primavera ... ¡gracias! – c12

Respuesta

43

Hay que extraer SavedRequest de la sesión, no es crear una nueva:

SavedRequest savedRequest = 
    new HttpSessionRequestCache().getRequest(request, response); 
+0

Gracias por la respuesta ... No puedo encontrar la clave adecuada. He intentado request.getSession(). GetAttribute (WebAttributes.SAVED_REQUEST); Estoy usando seguridad de primavera 3.1.0.M1 – c12

+0

@ c12: No lo haga manualmente, use 'HttpSessionRequestCache', como se muestra arriba. – axtavt

+0

gracias lo tengo, funcionó! ¡muchas gracias! – c12

0

Yo no hacer que funcione con la solución propuesta, esto es lo que encontré: (Uso primavera 3.1).

En su clase de fitler:

CharsetFilter implements Filter { 
    @OVerride public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException { 
     HttpServletRequest hsr = (HttpServletRequest) request; 
     if (hsr.getUserPrincipal() == null) { 
      HttpSession session = hsr.getSession(); 
      if (!(hsr == null)) { 
       logger.info("path : " + hsr.getPathInfo()); 
       session.setAttribute("beforeLoginUrl", hsr.getPathInfo()); 
    } 
    } 
} 

Entonces i tu web.xml declaran su filtro:

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter> 
    <filter-name>charsetFilter</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> 
</filter> 
<filter-mapping> 
    <filter-name>charsetFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter> 
    <filter-name>CharsetFilter</filter-name> 
    <filter-class>com.ent.foo.CharsetFilter</filter-class> 
    <init-param> 
     <param-name>requestEncoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
</filter> 

Luego, en su URL de redirección después del inicio de sesión correcto acaba de obtener el HttpSession vuelta:

@RequestMapping(value = "successful") 
public void showSuccessfulogin (HttpSession session) { 
    String redirectUrl = (String) session.getAttribute("beforeLoginUrl"); 
    if (redirectUrl != null) { 
     session.removeAttribute("beforeLoginUrl"); 
     return "redirect:" + redirectUrl; 
    } 
    return "redirect:/"; 
} 

Aquí tienes las cosas para que funcione, pero h Ave para comprobar el

hsr.getPathInfo() 

y ver si se termina con css o js, ​​etc ...

Además, si el inicio de sesión fallan usted debe ver si ya está atributo de sesión establecer y ver cualquier otro caso especial!

Por cierto, mi filtro se utilizó anteriormente para formatear todas las entradas/salidas en utf-8.

Espero que ayude a cualquiera.

+1

No debe usar el filtro para recursos estáticos, esto afectará mucho al rendimiento. – weekens

+0

¿Podría ser más preciso? – rweiller

+0

En general, coloca sus archivos estáticos en un directorio con acceso anónimo o en un servidor completamente diferente que no tiene seguridad. solo los recursos estáticos que son realmente un problema de seguridad (es decir, no css o js) deben estar protegidos por la seguridad. de lo contrario está haciendo todo este procesamiento (y más de lo que no ve) para cada solicitud de recursos estáticos cuando no es necesario. – user2932397

5
SavedRequest savedRequest = 
    (SavedRequest)session.getAttribute("SPRING_SECURITY_SAVED_REQUEST"); 
// ...check for null... 
String targetUrl = savedRequest.getRedirectUrl(); 

feo pero trabajando, si no tiene la HttpServletResponse disponibles (por ejemplo, en caso de que utilice org.springframework.social.connect.web.SignInAdapter).

Probado con Spring Security 3.1.0.RC2.

0

Para mí he usado Spring Security 3.0.0 y los siguientes trabajó:.

DefaultSavedRequest savedRequest = (DefaultSavedRequest) request.getSession() getAttribute ("SPRING_SECURITY_SAVED_REQUEST_KEY"); targetUrl = savedRequest.getRedirectUrl();

Cuestiones relacionadas