Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过本地访问用户';s数据_Php_Mysql_Yii_Single Sign On - Fatal编程技术网

Php 通过本地访问用户';s数据

Php 通过本地访问用户';s数据,php,mysql,yii,single-sign-on,Php,Mysql,Yii,Single Sign On,我正在尝试创建一个像谷歌一样的跨域登录。所以你的youtube、gmail、google+等都有相同的账户。但是,有几个问题我很困惑: 假设我有5个网站,除了他/她的电子邮件、用户名和密码之外,我不想传输任何关于该用户的数据。如果我只有1个用户数据库而不是5个,那么每次我调用用户数据库访问用户的个人资料图片、用户名等时,我是否需要调用远程数据库 我一直在考虑使用远程用户和会话数据库,这样每个子站点都可以访问该数据库,而不是本地用户和会话数据库。但我的应用程序广泛使用表,我担心每次从远程数据库获取

我正在尝试创建一个像谷歌一样的跨域登录。所以你的youtube、gmail、google+等都有相同的账户。但是,有几个问题我很困惑:

假设我有5个网站,除了他/她的电子邮件、用户名和密码之外,我不想传输任何关于该用户的数据。如果我只有1个用户数据库而不是5个,那么每次我调用用户数据库访问用户的个人资料图片、用户名等时,我是否需要调用远程数据库

我一直在考虑使用远程用户和会话数据库,这样每个子站点都可以访问该数据库,而不是本地用户和会话数据库。但我的应用程序广泛使用表,我担心每次从远程数据库获取数据的性能

我如何才能以一种干净的方式实现这一点,使每个子站点都可以轻松地在本地访问用户信息,并且它们也可以像谷歌及其产品一样共享相同的登录/注销过程?(我在MySQL中使用一个名为Yii的PHP框架)


我提出了以下解决方案,并将其作为答案发布,如果有任何问题,请提供建议?谢谢你们的帮助

  • 在每个子站点中都有一个用户表,比如child1.com和child2.com
  • 在父站点中有一个超级用户表,比如parent.com
  • 当用户登录child1.com时,检查标识,重定向到parent.com/child1进行注册或登录。完成后,使用加密URL重定向回child1以自动登录用户。如果用户的信息已从父数据库更改,我们可以在此处将其同步到子数据库(如果是注册过程而不是登录过程,请将用户id、用户名和电子邮件写入数据库,以便您可以从child1.com本地访问此信息)
  • 当用户登录child2.com时,它会重定向到parent.com/child2,但是,用户已通过parent1.com的身份验证,因此它会将用户重定向到child2,而不使用加密的URL,因此child2.com会直接登录用户
  • 对于注销过程,注销child1.com&curl其他加密注销链接可从其他站点(如child2.com或parent.com)注销此用户

  • 在与一群人交谈之后,下面的方法似乎很有希望

  • 在每个子站点中都有一个用户表,比如child1.com和child2.com
  • 在父站点中有一个超级用户表,比如parent.com
  • 当用户尝试登录child1.com时,请重定向到parent.com/child1进行注册或登录。完成后,使用加密URL重定向回child1以自动登录用户。如果用户的信息已从父数据库更改,我们可以在此处将其同步到子数据库(如果是注册过程而不是登录过程,请将用户id、用户名和电子邮件写入数据库,以便您可以从child1.com本地访问此信息)
  • 当用户登录child2.com时,它会重定向到parent.com/child2,但是,用户已通过parent1.com的身份验证,因此它会将用户重定向到child2,而无需再次登录,child2.com会使用parent.com的加密URL直接登录用户
  • 对于注销过程,例如用户从child1.com注销,我们会自动卷曲其他加密注销链接,以从其他站点(例如child2.com或parent.com)注销该用户

  • 拥有一个包含用户信息的远程数据库(父服务器)听起来是最简单的解决方案

    请记住,默认情况下,PHP会话存储在服务器的本地文件系统中。因此,当您使用website-B的会话数据登录website-B时,您不会登录任何其他站点

    这就是魔法发生的地方。您需要指示PHP使用远程MySQL数据库来存储会话数据,而不是本地机器的文件系统。一旦建立,这就像魔术一样

    我在谷歌上快速搜索了一下,找到了这个网站,上面有为PHP设置MySQL会话表的说明。

    您可以编辑UserIdentity类,在每个网站的components文件夹中找到它,并覆盖authenticate()方法以检查OAuth、远程数据库、web服务或任何您认为合适的方法。。。不要担心性能,因为每个会话只执行一次登录…

    为什么不创建类似的东西

    MasterSite.com

    使用者

    • 身份证
    • 用户电子邮件
    • 密码
    地点

    • 名字
    • 领域
    网站用户

    • 身份证
    • 用户id
    • 站点id
    Child1.com

    假设用户的名字是Joe,并且已经访问了www.child1.com。他点击www.child1.com/register/。他将被重定向到www.mastersite.com/register/site/child1。注册后,他将被重定向回www.child1.com/session_id/abcdefgh12345

    现在假设用户访问www.child2.com。他还访问了www.child2.com/login/。系统将重定向他或从www.mastersite.com/login/弹出一个登录。如果www.mastersite.com上已经存在会话id,则用户将被简单地重定向回www.child2.com/session_id/abcdefgh12345

    该会话id将存储在MasterSite.com的数据库中,偶尔会由www.childX.com根据需要进行更新


    在每个网站上存储用户的数据在一定程度上是可以的,但很快就会变得丑陋。然而,由于现在有基于云的解决方案。。。如果有需要,我认为扩展主站点的数据库或CPU能力不会有太大问题。

    反对票是关于什么的?@jackhao:很可能是因为你的问题太广泛了。这是无法回答的。使用Yii,这将是一些登录远程服务和会话处理的混合。了解授权和身份验证以及两者之间的区别。@hakre谢谢。我已经编辑了这个问题。我担心的一件事是远程会话处理或我们