0

我有一个通过标准 Tomcat 机制对用户进行身份验证的 Web 应用程序。更具体地说,我配置了JDBCRealm指向我自己的用户和角色表的 a,并且我正在使用基于表单的身份验证,它将用户详细信息提交给j_security_check操作(asj_usernamej_password)。安全约束在我的web.xml文件中配置。

现在,我想为用户提供第二个登录选项:Facebook。我已经使用他们的 Javascript SDK 配置了 Facebook 登录,但是我在集成两个登录选项时遇到了问题。理想情况下,当用户登录 Facebook 时,我还必须在 Tomcat 领域模拟身份验证,以确保 Facebook 用户的行为与普通 Tomcat 用户一样。这意味着我还必须在我自己的用户表中注册 Facebook 用户。

我的第一个想法是在用户完成 Facebook 登录后立即在我自己的用户表中注册用户(例如,使用 Ajax 请求)。当此请求完成时,我将能够触发手动提交到j_security_check.

Facebook 响应包括一个用户id和一个token我可以使用的用户。但是,我不知道使用什么信息作为j_password. 我什至不知道使用表单身份验证是否是最好的选择。

集成两个登录选项的最佳方式是什么?

非常感谢!

4

1 回答 1

0

一种选择是使用组合领域:请参阅http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#CombinedRealm

领域 1 应该是 JDBCRealm,然后实现领域 2 (FacebookRealm)。您可以根据最常用的顺序更改顺序。有关如何实现领域的信息,请参阅 Tomcat 文档。

当然,您在 FacebookRealm 中没有密码,但您可以执行以下技巧:
JDBCRealm:
用户名 = 应用程序中的用户名/用户 ID
密码 = 密码
FacebookRealm:
用户名 = 应用程序中的用户名/
用户 ID 密码 = 由提供的唯一用户 ID Facebook

这可以允许用户使用他们想要的任何方法登录。

基本上,这可能是通过 FacebookRealm 登录的一个可能用例(第一步可能与 JS SDK 略有不同,但想法相似):
1. 通过链接将用户发送到 Facebook 进行身份验证。
2. Facebook 使用令牌重定向到您的服务器。
3. 您的服务器发出 Facebook 调用以验证用户的真实性。
4. 你的服务器知道它是一个有效用户,所以它从 Servlet 调用 login(username, facebookUserId) 方法。请参阅:http ://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#login (java.lang.String , java.lang.String)
4.1。在调用登录方法之前,请确保您的数据库中存在“用户名”和“facebookUserId”。
5. Tomcat FacebookRealm 只会对该用户名和 ID 执行数据库查询。

我希望这能让您更深入地了解如何做到这一点。
其他选项可能是通过 Apache Shiro、Spring Security 或其他可能的。

于 2013-10-27T08:41:45.093 回答