20

我有一个部署了 oldApp.war 和 newApp.war 的 tomcat 7 设置。两个应用程序为数据库上的用户共享相同的登录凭据。

我可以分别使用https://localhost/oldApp和访问应用程序https:localhost/newApp

我的 oldApp 是一个 Spring MVC java 应用程序,当用户登录到 oldApp 时,我想要一个链接,该链接将用户带入 newApp 而无需询问登录凭据。

我想知道如何实施 SSO 来做到这一点。我最好不想运行任何外部服务来处理这个问题。

提前致谢。

4

4 回答 4

12

更新:它的 2018 年和以下信息已过时。如果您正在启动一个新应用程序,那么使用像 Open ID Connect 这样的联合身份协议,您将免费获得 SSO。

您可以采取以下几种方法:

  1. 您可以使用 Tomcat 进行身份验证并使用 Tomcat 的单点登录功能。如果您当前正在使用 Spring 对用户进行身份验证,则可能需要更改一些内容。此外,根据您进行身份验证的方式,Tomcat 的身份验证可能无法进行足够的配置。
  2. 您可以设置第三个,CAS,servlet(或类似的东西),两个 Web 应用程序都针对它们进行身份验证。
  3. 您可以使用 Spring 和pre-authenticated filters 自行设置。您基本上必须编写自己的预身份验证过滤器,该过滤器在回退到旧的身份验证方法之前检查两个 servlet 都可以访问的某个位置(数据库?共享上下文?)是否存在现有凭据。您需要确保在某处的过滤器中清除此身份验证,以便下一个请求不会自动继承先前的请求凭据。
于 2013-02-19T13:10:02.490 回答
9

您可以通过多种不同方式实现 SSO:

  1. Oauth 2 - http://oauth.net/2/
  2. SAML 2 - https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=security

SAML 2.0 有许多身份/服务提供者角色的实现。

对于 IDP 实现列表,我可以将您指向此 stackoverflow 帖子: https ://stackoverflow.com/a/761774/126414

如果您打算实现一个服务提供者,有一个不错的 spring 扩展: http ://static.springsource.org/spring-security/site/extensions/saml/index.html

于 2013-02-19T13:17:37.453 回答
4

我已经用 Tomcat 的SSO Valve管理了这个:

  1. 将 SSO Valve 放在文件的 Host (localhost) 元素中server.xml

    <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> </Host>

  2. 添加用户和角色(例如 in tomcat_users.xml):

    <user username="user1" password="user1" roles="employee"/>

  3. web-app应用web.xml文件的元素中,添加安全约束:

    <security-constraint> <web-resource-collection> <web-resource-name>App name</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>employee</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>file</realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> </login-config> <security-role> <role-name>employee</role-name> </security-role>

  4. 而已。现在,登录到您的一个应用程序,您应该登录到其他应用程序。

当然,你不应该在生产中使用纯文本密码,这只是一个简单的例子。您应该考虑Digest 身份验证,以及在 Tomcat 上配置 SSL

我希望这会对某人有所帮助!

PS如果您将用户存储在SQL数据库中,请查看我在此答案下方的评论。

于 2017-12-07T13:08:48.837 回答
3

You can deploy the CAS server (which is nothing but a war) in tomcat and configure your web app's filter accordingly. You can take help from this link.

于 2013-05-30T12:31:16.397 回答