2013-07-18 94 views
0

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

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

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

Facebook的回复包括我可以使用的用户idtoken。但是,我不知道使用什么信息作为j_password。我甚至不知道使用form-authentication是否是最好的选择。

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

非常感谢!

回答

0

一种选择是使用相结合的境界:见http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#CombinedRealm

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

当然,你不必在一个FacebookRealm密码,但你可以做下面的技巧:
JDBCRealm:
用户名=用户名/用户id在应用程序
密码=密码
FacebookRealm:
用户名=您的应用程序中的用户名/用户ID
password =由Facebook提供的唯一用户ID

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

基本上,这可能是(第一步骤可能与JS SDK有点不同,但这个想法是相似的)一个可能的使用情况,通过FacebookRealm登录:
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或其他可能的选项。

相关问题