You are here

11 内置单点登录

admin 的头像
Submitted by admin on 星期四, 2015-06-25 09:46

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

    我们在前面列举了多种解决方案,但是在实践中,当我们用到统一用户登录的时候,我们可以首先考虑一下,Drupal内置的统一用户登录是否适用。是的,Drupal自带了一种统一用户登录解决方案。

 

    我们首先来看一下,内置的解决方案适用的条件,它包含三点:

• 这些多个站点的域名必须一致,比如 www.example.com forums.example.com subsite.example.com 

• 必须使用 MySQL. 

• 这些站点必须在同一服务器上.

 

    这种内置的统一用户登录机制,充分利用了Drupal的数据库表前缀机制,Drupal本身的跨表查询的机制、MySQL的跨数据库查询能力,还有通过设置cookie domain可以共享多个站点的session会话信息。

 

    我们现在来实际操作一下,假定我们的主站点为thinkindrupal.com,同时还包含两个子站点answer.thinkindrupal.com、forum.thinkindrupal.com。我们要在本地搭建环境,所以首先我们需要修改我们的hosts文件,我这里是vista操作系统,使用管理员身份打开hosts文件,然后向里面添加以下信息:

 

127.0.0.1 thinkindrupal.com

127.0.0.1 answer.thinkindrupal.com

127.0.0.1 forum.thinkindrupal.com

    接着,我们在一个空的web根目录,在xampp环境下就是htdocs目录,放置一个Drupal安装,然后在sites目录下,创建3个文件夹,thinkindrupal.com、answer.thinkindrupal.com、forum.thinkindrupal.com。目录结构如图所示:

 

图片1.png 

    接着,我们分别按照正常方式安装thinkindrupal.com、answer.thinkindrupal.com、forum.thinkindrupal.com三个站点。这里假定它们对应的数据库分别为tid、tid_answer、tid_forum。没有的话,我们分别为其创建好就可以了。

    下面是没有共享用户时的settings.php文件中的数据库配置:

thinkindrupal.com :

$databases['default']['default'] = array(

  'driver' => 'mysql',

  'database' => 'tid',

  'username' => 'root',

  'password' => '',

  'host' => 'localhost',

  'prefix' => '',

);

 

answer.thinkindrupal.com:

$databases['default']['default'] = array(

  'driver' => 'mysql',

  'database' => 'tid_answer',

  'username' => 'root',

  'password' => '',

  'host' => 'localhost',

  'prefix' => '',

);

 

forum.thinkindrupal.com

$databases['default']['default'] = array(

  'driver' => 'mysql',

  'database' => 'tid_forum',

  'username' => 'root',

  'password' => '',

  'host' => 'localhost',

  'prefix' => '',

);

    在安装Drupal时,我们分别将三个站点用户1的用户名设置为了admin、answer、forum。为了让answer、forum两个子站点能够共享主站的用户信息,让我们分别修改它们的settings.php文件,修改后的配置如下所示:

 

answer.thinkindrupal.com:

$databases['default']['default'] = array(

  'driver' => 'mysql',

  'database' => 'tid_answer',

  'username' => 'root',

  'password' => '',

  'host' => 'localhost',

  'prefix' => array(

   'default'   => '',

    'users'     => 'tid.',

    'sessions'  => 'tid.',

    'role'      => 'tid.',

    'authmap'   => 'tid.',

  ),

);

 

forum.thinkindrupal.com

$databases['default']['default'] = array(

  'driver' => 'mysql',

  'database' => 'tid_forum',

  'username' => 'root',

  'password' => '',

  'host' => 'localhost',

  'prefix' => array(

   'default'   => '',

    'users'     => 'tid.',

    'sessions'  => 'tid.',

    'role'      => 'tid.',

    'authmap'   => 'tid.',

  ),

);

 

    注意,我们在这里设置了prefix,将userssessionsroleauthmap表挂在了主站上。对于其它表,则采用本安装所使用的数据库。现在我们就可以使用admin用户来登录answer.thinkindrupal.com、forum.thinkindrupal.com两个站点了。

    此时,如果我们登录了三个站点后,比如从forum.thinkindrupal.com上登出,但是我们访问thinkindrupal.com站点时,仍然是登录的状态。现在美中不足的就是,登录和登出不是同步的。为了能够同步的登录和登出,我们还需要设置settings.php文件中$cookie_domain。我们将3个settings.php文件中的$cookie_domain都设置为:

 

$cookie_domain = '.thinkindrupal.com';

    注意最前面的“.”号是必须要有的。此时当我们从thinkindrupal.com登录后,访问answer.thinkindrupal.com、forum.thinkindrupal.com两个站点,仍然处于登录状态。如果我们从thinkindrupal.com登出,那么访问answer.thinkindrupal.com、forum.thinkindrupal.com两个站点,状态就变成了匿名用户。

    初次配起来,可能稍微有点复杂,但它却能解决我们的大问题,这就是我们想要的。


Drupal版本: