技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> 【译】无附加模块实现Drupal的多子域名下的单点登录

【译】无附加模块实现Drupal的多子域名下的单点登录

浏览:2615次  出处信息

现在市面上有太多的Drupal单点登录模块,以至于我们很容易就忽略了Drupal本身内建单点登录的事实。不需要任何模块,不需要任何设置,短短的20行settings.php中的代码就可以实现。这个办法在很多人那里可以使用,但是什么时候使用这个办法,还是有一些具体的要求,例如:
- 这些共享一次登录的网站,在同一个主目录下,如:
- www.colblog.net
- forums.colblog.net
- subsite.colblog.net
- 必须使用mysql
- 你的网站必须在同一个物理集群上,可以互相访问数据库。
如果你的网站达到了这些要求,你马上就可以享受到简单、高效的单点登录了!
可以使用这个办法单点登录的依据在于,Drupal有内建的机制可以使用表前缀,这样就可以让你的多个Drupal网站运行在一个MySQL的数据库中(,使用不同的表前缀来区分不同的网站)。但是大部分网站并没有使用前缀来配置自己的网站,而是给每一个网站一个单独的数据库。好在Drupal的表前缀特性加上MySQL的跨数据库查询特性,可以解决你的多个数据库中的共享表问题。如此之后,你只需要设置一个cookie domain,让两个网站的共享会话信息,那么你就搞定了!
如果上面的听起来有点棘手,我们现在就开始编码。打开两个网站的settings.php文件(通常放在sites/default/settings.php)。这些网站可以是分别使用各自的Drupal安装目录,或者是共享一个Drupal安装目录(Drupal支持单个安装目录多个站点)。
主站的配置:
在主站(用户信息将会存储在主站中)中,你不需要进行什么复杂的修改,有可能有一行类似于如下的代码:

<?php
$db_url
= 'mysql://user:<a href="mailto:pass@localhost">pass@localhost</a>/master_database'
;
$db_prefix = ''
;
?>

你完全不需要修改这些代码,主站将会保存所有的用户名、密码、会话信息。但是还有另外一行需要进行修改,就是你的cookie domain。这里需要被反注释掉(删掉行首的#)然后写上你的网站的域名。
请确认域名前面一定要包含这个点
<?php
$cookie_domain
= '.example.com'
;
?>

从站的配置:
从站的那些包含用户信息的表需要连接到主站的数据库中,这就让用户在从站上的“登陆”操作会从主站数据库上取得数据。
下面就是我们使用mysql的前缀,来让所有到从库特定表的查询全部指向主库:
<?
$db_url = 'mysql://user:pass@localhost/slave_database';
$db_prefix = array(
'default' => 'name_of_slave_database.',
'users' => 'name_of_master_database.',
'sessions' => 'name_of_master_database.',
'role' => 'name_of_master_database.',
'authmap' => 'name_of_master_database.',
);
?>
然后我们让cookie domain和主站一样:
<?php
$cookie_domain
= '.example.com'
;
?>

这样修改之后,用户登陆的方法完全没有改变,用户可以使用同样的用户名和密码登陆两个网站,登陆到一个网站会立刻登陆到所有的网站上,用户甚至可以修改密码,并且在所有的网站都生效,并且你可以使用Views中建立好的对用户列表的修改,而不需要做任何修改。感谢共享cookie!
多说两句:
仅仅在settings.php中添加几行代码可以让单点登录操作变成小菜一碟。需要注意的是,这么做的话,其他和用户相关的信息也需要同样被共享,特别是如果你使用了profile模块,你需要同样共享profile_fields和profile_values表。
有一个问题你可以会遇到,就是你的用户头像的地址需要全部被关联到主站的用户头像地址上。要解决这个问题,我们只需要添加一个软连接就可以了:
<?php
ln
-s /usr/home/example.com/sites/default/files/pictures /usr/home/subsite.example.com/sites/default/files/
pictures
?>

再次声明,这个方法在同一个域名下多个架设在同一组服务器上的网站上是可用的。浏览器由于安全考虑会禁止不同域名之间的网站互访cookie,这个时候,你就需要寻找其他解决方案了,比如OpenID Provider, Single Sign-on, 或者 Bakery。
这个文章是由我们的老朋友Dooce提供的,在他们的网站上使用了这个办法:
http://www.dooce.com
http://community.dooce.com

建议继续学习:

  1. 初探单点登录 SSO    (阅读:9326)
  2. Apache + Jetty 架设 CAS 单点登录    (阅读:4176)
  3. 互联网上的单点登录研究    (阅读:4005)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1