2013-07-18 54 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或其他可能的選項。

相關問題