Spring Security的几种不同的登录表单

时间:2011-01-12 18:52:10

标签: java configuration spring-mvc spring-security

我正在使用带有自定义身份验证的spring-mvc的spring-security网络身份验证,到目前为止一切都很顺利:

                   

我的问题是:/login使用功能齐全的页面加载视图,但现在我必须为iframe / popup格式提供身份验证(例如,对于经过身份验证的书签),因此加载不同的视图(或者不同的参数)。

我看到两个不太复杂的解决方案:

  1. 在我的/login操作中,我有一种方法(目前尚未知道)检索原始请求并根据一组使用更简单视图的URL进行检查,然后选择匹配的视图。 =>如何检索此原始请求?

  2. 我创建了另一个登录操作/表单,比如/login/minimal,它也发布到弹簧安全URL /j_spring_security_check,但我需要实现请求存储/检索机制,以便成功登录后执行原始请求。 =>我认为这与SecurityContextPersistenceFilter有关,但我不知道如何实现或调用它。

2 个答案:

答案 0 :(得分:1)

关于你的第一个问题:

有一个班级org.springframework.security.web.authentication.WebAuthenticationDetails

它只包含客户端及其Session的IP,但

它有一个方法

protected void doPopulateAdditionalInformation(HttpServletRequest request) {}

我相信你可以通过继承并添加请求网址来增强这一点。 - 但首先检查请求是来自登录表单的请求,还是“阻止”请求。

<强>加

Chris Thompson posted an other part of the puzzle回答你的问题: 他提到可以从会话中获取已保存的请求:

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

所以你可以把它结合起来,而不是只需要阅读它已经包含的会话的WebAuthenticationDetails。

@see Chris Thompson answer

答案 1 :(得分:1)

如果我正确理解您的问题,您希望根据原始请求字符串更改登录页面。查看this forum post以访问会话中的原始请求网址。这是旧版本,但您应该可以使用它来开始。

编辑我没有机会对此进行验证,但看起来密钥在Acegi安全性和Spring Security 3之间发生了变化。看起来您可以使用常量从会话中访问它WebAttributes课程。{{3}}。有效地

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