作者:老葛,北京亚艾元软件有限责任公司,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。目录结构如图所示:
接着,我们分别按照正常方式安装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,将users、sessions、role、authmap表挂在了主站上。对于其它表,则采用本安装所使用的数据库。现在我们就可以使用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两个站点,状态就变成了匿名用户。
初次配起来,可能稍微有点复杂,但它却能解决我们的大问题,这就是我们想要的。