2011-01-12 33 views
4

我使用弹簧安全Web认证与弹簧MVC使用自定义验证和一切都很好,到目前为止:几种不同的登录表单

我问题是:/login加载一个功能齐全的页面的视图,但现在我必须提供iframe/popup格式的认证(例如对于认证的小书签),因此加载不同的视图(或不同的参数)。

我看到了两个解决方案,没有过于复杂的:

  1. 在我/login行动,我有一个办法(未知对我迄今为止)来检索原始请求,并检查它针对一组网址是使用更简单的视图,然后选择匹配的视图。 =>我如何检索这个原始请求?

  2. 我再拍登录动作/形式,说/login/minimal,这也POST到春季安全网址/j_spring_security_check,但我需要实现请求存储/检索机制,使原来的请求被成功登录后进行。 =>我看到这与SecurityContextPersistenceFilter有关,但我不知道如何实现或调用它。

+0

只是为了澄清,你想弄清楚如何根据原始请求显示不同的登录页面,或者你问的东西不同吗? – 2011-01-12 20:40:07

+0

不,你说得对,那是我的解决方案#1,我问了如何去做。 – 2011-01-13 11:04:23

回答

1

如果我正确理解你的问题,你希望改变在原有基础上请求字符串的登录页面。查看this forum post以访问会话中的原始请求url。它适用于较旧的版本,但您应该可以使用它开始。

编辑我还没有机会来验证这一点,但它看起来像关键Acegi安全和Spring安全3.看起来你可以从会议中WebAttributes类使用常量访问之间变化。有效地

//request is a HttpServletRequest object 
SavedRequest savedRequest = (SavedRequest)request.getSession().getAttribute(WebAttributes.SAVED_REQUEST); 
String url = savedRequest.getRequestURL(); 
1

关于第一个问题:

还有一类org.springframework.security.web.authentication.WebAuthenticationDetails

它仅包含客户端的IP和它的会话,但

它有一个方法

protected void doPopulateAdditionalInformation(HttpServletRequest request) {} 

我相信你可以通过继承并增加请求url来增强它。 - 但请首先检查请求是来自登录表单的请求还是“已阻止”请求。

新增

Chris Thompson posted an other part of the puzzle回答你的问题: 他提到,保存的请求可以从会议获得的:不是enhanding的WebAuthenticationDetails你

//request is a HttpServletRequest object 
SavedRequest savedRequest = (SavedRequest)request.getSession().getAttribute(WebAttributes.SAVED_REQUEST); 
String url = savedRequest.getRequestURL(); 

所以,你可以结合这一点,只需要阅读已经包含的会话。

@see Chris Thompson answer

+0

这看起来很有趣,但你如何知道请求是否被阻止? – 2011-01-12 21:17:48