我有一个Web应用程序,通过标准的Tomcat机制对用户进行身份验证。更具体地说,我配置了JDBCRealm
指向我自己的用户和角色表,我正在使用基于表单的身份验证,该身份验证将用户详细信息提交到j_security_check
操作(作为j_username
和j_password
)。安全约束在我的web.xml
文件中配置。
现在,我想为用户提供第二个登录选项:Facebook。我已经使用他们的Javascript SDK配置了Facebook登录,但是我在集成两个登录选项方面遇到了问题。理想情况下,当用户登录Facebook时,我必须在Tomcat领域中模拟身份验证,以确保Facebook用户的行为与常规Tomcat用户相同。这意味着我还必须在我自己的用户表中注册Facebook用户。
我的第一个想法是在完成Facebook登录后立即在我自己的用户表中注册用户(例如,使用Ajax请求)。当此请求完成后,我将能够触发手动提交到j_security_check
。
Facebook回复包括我可以使用的用户id
和token
。但是,我不知道将哪些信息用作j_password
。我甚至不知道使用表单身份验证是否是最佳选择。
集成两种登录选项的最佳方式是什么?
非常感谢!
答案 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或其他可能。