2011-03-22 76 views
14

我需要根据用户来自哪里修改我的spring安全登录页面。我的客户想要两种风格不同。如果您来自appcontextroot/test vs appcontextroot/choose。我试图做下面的事情,但String url=savedRequest.getRedirectUrl();已经和春季登录页面相同,而不是用户所要求的初始页面。有任何想法吗?Spring Security 3初始请求URL

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

我认为你必须创建两个不同的登录页面,并带有相应的过滤器。 – 2011-03-22 09:48:23

+0

Alois,感谢您的回应,您是否知道这样做的一个例子。我是春季安全新手......谢谢! – c12 2011-03-22 09:55:40

回答

43

您需要从会议中提取SavedRequest,而不是创建一个新:

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

感谢您的回复......我无法找到正确的密钥。我试过request.getSession()。getAttribute(WebAttributes.SAVED_REQUEST);我正在使用spring security 3.1.0.M1 – c12 2011-03-22 09:53:43

+0

@ c12:不要手动执行,使用'HttpSessionRequestCache',如上所示。 – axtavt 2011-03-22 09:56:04

+0

感谢了,它的工作!非常感谢! – c12 2011-03-22 10:02:10

0

我没有做它与提出的解决方案的工作,这里是我的发现: (使用春天3.1)。

在你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()); 
    } 
    } 
} 

然后我你的web.xml中声明你的过滤器:

<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> 
在成功登录后,您重定向URL

然后,只需获得HttpSession中回:

@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:/"; 
} 

在这里你得到的东西,使其工作,但你会h AVE检查

hsr.getPathInfo() 

,看看它是否具有的CSS或.js文件,等结束...

此外,如果登录失败,你应该看到,如果会话属性已经设置并查看任何其他特殊情况!

Btw我的过滤器曾用于utf-8格式化所有输入/输出。

希望它会帮助任何。

+1

你不应该使用静态资源的过滤器,这将大大降低性能。 – weekens 2013-01-20 14:51:20

+0

你能更精确吗? – rweiller 2013-02-15 14:23:13

+0

一般而言,您可以将静态文件放在具有匿名访问权限的目录中,也可以放在完全不同的服务器上,该服务器上没有任何安全性。只有真正的安全问题(即不是css或js)的静态资源应该受到安全保护。 否则当你不需要每一个静态资源请求时,你正在做所有这些处理(以及你看不到)。 – user2932397 2014-01-16 18:05:58

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

丑,但工作,如果你没有提供的HttpServletResponse的(例如,如果你使用org.springframework.social.connect.web.SignInAdapter)。

经过Spring Security 3.1.0.RC2测试。

0

对我来说,我使用Spring Security的3.0.0和以下工作:

DefaultSavedRequest savedRequest =(DefaultSavedRequest)request.getSession()的getAttribute( “SPRING_SECURITY_SAVED_REQUEST_KEY”); targetUrl = savedRequest.getRedirectUrl();