两个webapps之间的共享身份验证和SSO

时间:2014-07-29 14:02:11

标签: java authentication spring-security single-sign-on http-authentication

我在使用Spring Security进行身份验证的不同域/服务器上有两个Java wepapp。第一种是处理本地存储应用程序数据库中用户的身份验证。对于第二个,我想使用相同的用户帐户对用户进行身份验证,而不是单个登录的第一个webapp(如果用户在第一个webapp中进行了身份验证,则不应该在第二个webapp中再次输入他的信息)

我确定了三种可行的方法,但它看起来并不简单:

  • 共享Cookie:为两个应用程序使用共享会话cookie和相同的数据库。这似乎相对容易,但两个webapps需要在同一个域上,这对我的应用程序来说并非如此。

  • 目录服务:使用中央目录服务(LDAP),两个Web应用程序将使用它来处理身份验证。实现起来似乎很重,用户不能再存储在第一个webapp数据库中。现有用户帐户需要迁移到LDAP中,并且无法使用第一个webapp创建新用户。

  • OAuth:似乎可以通过提供OAuth api(例如Google签署某种服务)来使第一个webapp处理外部身份验证请求。这将允许第二个webapp使用此API来验证用户,但我不确定登录过程是否完全透明以处理单点登录。它实现起来似乎也不容易,因为它需要在第一个webapp中开发完整的OAuth api。

我还查看了这个似乎提供可以与外部数据库连接的身份验证API的服务https://auth0.com,但是我不确定它是否可以与Spring Security连接并且它还要求使用在线解决方案并非理想。我不确定它是否会处理单点登录,只有共享帐户。

还有其他方法可以处理这个更直接的用例吗?

2 个答案:

答案 0 :(得分:1)

CAS确实是一个很好的候选者,可以作为您需要的SSO系统,它有几个CAS客户端用于Spring Security。您可以在云端CAS中免费试用CAS服务器v4.0:http://www.casinthecloud.com ...

答案 1 :(得分:1)

正如您所提到的,共享Cookie不会跨域工作。

LDAP会为您提供共享凭据(单个名称/ pw适用于两个系统),但不能单点登录,并且您注意到您将遇到配置问题。

对Spring Security一无所知,可能性很高,你不会找到一个无痛的解决方案。集成SSO充满了工作流问题(用户配置,密码恢复,用户配置文件维护等)。

我们有一个经典的数据库管理身份验证方案。之后,当我们添加LDAP支持时,我们添加了"自动配置"的功能。这基本上包括让应用程序在登录期间从LDAP存储中提取相关的人口统计信息,并且每次用户登录时只需更新字段。如果用户不存在,我们会动态创建一个。

这很有效,因为应用程序的其余部分没有LDAP的意识。它只使用我们已经管理的用户配置文件,如果它需要来自数据库的东西,那么数据就在那里。

稍后,当我们集成SSO时,我们只是利用现有的LDAP逻辑从SSO服务器中提取并执行相同的操作。

此工作流程在配置和管理方面提供了很多帮助。我们可以维护权威来源(LDAP,SSO),并且应用程序保持不变。它阻碍的是本地编辑用户配置文件,因此我们只是禁用了它。让他们查看配置文件,但他们可以转到其他系统门户进行管理。不太优雅,但无论如何它都是一个罕见的用例,所以我们只是混淆了它。我们最终推出了双向推送和复制等方式,但如果你不需要它,那将是一个真正的痛苦。

如果您想了解如何进行跨域SSO,请查看此处:Cross Domain Login - How to login a user automatically when transferred from one domain to another

对于我们的SSO,我们使用SAML v2 Web Profile,但我们最终编写了大部分自己的代码来完成它。

但是,无论网站上说什么,总体而言,整合这一点并非易事。围绕它的边缘案例和工作流程/帮助台问题很多。它可以是一个调试的熊。