使用数据库和社交网站登录
Posted
技术标签:
【中文标题】使用数据库和社交网站登录【英文标题】:Login using DB and Social website 【发布时间】:2013-02-27 18:04:04 【问题描述】:我有一个拼车网站,用户可以通过我的数据库登录,一切正常。
登录后,用户可以发布拼车广告。
现在我需要用户通过 Facebook 登录。这种情况如何处理?
案例 1:用户未在我的数据库中注册并使用 Facebook 凭据。我可以显示只读页面,但现在说用户要发布广告,这种情况我该怎么办?
我的数据库的结构使得 postAd 表具有 user_id 作为外键,所以在这种情况下,我应该添加一个具有该 email_id 的用户和一个虚拟密码以允许他们发布吗?或者这样的场景是如何处理的?
案例 2:如果用户使用 Facebook 登录,我是否需要使用该电子邮件 ID 在我的数据库中搜索才能找到该用户?
我正在使用 Spring Security。
这样的网站一般是如何运作的?
谢谢。
【问题讨论】:
【参考方案1】:查看Spring Social 和Spring Social Facebook 项目。他们这样做:
-
对于案例 1:有 Implicit sign up feature。您必须提供 ConnectionSignUp 实现,该实现将在 FB 连接建立但 DB 中没有相应用户时调用。您可以在此处创建新的数据库用户。
对于案例 2:有一个 SignInAdapter 接口(请参阅ProviderSignInController's dependencies
章)。您可以通过 userId 找到 DB 用户,然后准备 autentication 并将其注入 SecurityContextHolder。
总体思路:您可以拥有多个提供者(FB、Twitter 等),但在任何情况下,每个社交资料都将与某个 Spring Security 用户匹配(例如,将用于授权)。如果它们通过 userId 匹配,那么您可以为多个社交帐户拥有一个 Spring Security 用户。 这种方法的优点是您可以更好地控制用户配置文件(即使 FB 帐户处于活动状态,您也可以禁用本地用户帐户)。您可以通过 Java 代码使用 Facebook API。
作为选项 2,您可以通过 javascript 进行 FB 登录。然后手动实现案例 1 和案例 2 的两个功能(例如通过自定义过滤器)。它可能更轻量级(取决于您需要什么功能)。
【讨论】:
【参考方案2】:Facebook Oauth 为每个用户提供唯一的用户 ID。因此,如果用户使用 facebook 登录,最好将用户的详细信息(例如 ID、姓名、电子邮件等)存储在用户表中。所以,您可以使用该用户 ID 作为主键...如果用户已经存在 jsut 跳过这部分并将它们带到发布页面..
【讨论】:
以上是关于使用数据库和社交网站登录的主要内容,如果未能解决你的问题,请参考以下文章