如何登录从其他网站使用Spring Security的网站?

时间:2011-10-27 10:11:32

标签: java web-applications spring-security

为简单起见,我们称之为2个站点:

  • A - 用户已经在的网站

  • B - 使用Spring Security的网站,用户必须获取

我想在这里实现的流程如下:

  • 用户已登录网站A(知道他对网站B的凭据)
  • 用户点击网站A上的链接,将他带到网站B;这也将他登录到B,因此他不必输入任何帐户信息
  • 当用户退出站点B时,他被重定向到站点A

有哪些可能的方式/最佳方式?

编辑: A是在Apache Web服务器上运行的CGI应用程序。 B在Tomcat上运行。 SSO解决方案可能会解决问题,但设置起来很复杂。考虑到我已经可以访问凭据,我试图找到更简单的东西。我的第一个想法是直接在j_spring_security_check页面上使用AJAX POST请求。但是,由于某些原因,这似乎不起作用。 (我是Spring的新手,所以我想知道是否有人知道另一种方法来进行身份验证)。

2 个答案:

答案 0 :(得分:0)

这就是所谓的单点登录(SSO),并且有大量不同的解决方案,平台和产品可以实现它。这很大程度上取决于您正在使用的应用程序服务器和框架以及您运行的平台,因此,如果您为应用程序服务器和框架(即弹簧安全性)进行一些SSO解决方案搜索,您肯定会遇到溶液

答案 1 :(得分:0)

这是我的提议,前提是A和B都在您的控制之下

A中有一个链接 - > www.a.com/login-to-b

当用户点击该链接时,它会将用户重定向到(此网址是在服务器端生成的)

www.b.com/single-sign-on?user_id=123&timestamp=1234567&token=hash(user_id + timestamp + your-secret-key)

hash可以是md5或sha1,您的选择

如果A和B都拥有相同的密钥

然后B可以通过再次应用哈希来验证从A发送的信息

boolean isValid = hash(request.getParameter("user_id") + 
                       request.getParameter("timestamp") + 
                       KEY).equals(request.getParameter("hash");

时间戳有防止重放攻击

所以在B验证哈希之后,B还需要检查时间戳是否过期

// suppose we make it 5 sec to expire
boolean isExpired = System.currentTimeMillis() - timestamp < 5000; 

如果两个检查都通过,那么B可以确定重定向请求确实来自www.a.com并且有合法用户

现在您知道B处的user_id,然后执行特定于应用程序的内容以使用户识别B