使用Tomcat领域或Facebook登录进行身份验证

时间:2013-07-18 16:00:17

标签: facebook tomcat authentication login

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

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

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

Facebook回复包括我可以使用的用户idtoken。但是,我不知道将哪些信息用作j_password。我甚至不知道使用表单身份验证是否是最佳选择。

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

当然你在FacebookRealm中没有密码,但你可以做以下诀窍:
JDBCRealm:
您的申请中的username = username / userId
密码=密码
FacebookRealm:
您的申请中的username = username / userId
password = Facebook提供的唯一用户ID

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

基本上,这可能是通过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。在调用登录方法之前,请确保数据库中存在“username”和“facebookUserId” 5. Tomcat FacebookRealm将只为该用户名和id执行数据库查询。

我希望这能为您提供更多有关如何实现这一目标的见解 其他选项可以通过Apache Shiro,Spring Security或其他可能。