Drupal内置单点登录解决方案

单点登录英文全程Single Sign-On,简称SSO。Drupal的单点登录方案有其局限性,但在其可以工作的范围内,又是非常方便的。所以Drupal开发者至少应该学会这种单点登录方案。至于其他单点登录解决方案,有的需要安装其他模块,有的甚至需要配合其他软件和技术,这里就不深入探讨了。

注:本文所讲的配置方法适用于Drupal6, Drupal7的配置方法稍有不同,有时间再为大家总结。

在Drupal的settings.php里加入如下代码

$cookie_domain = '.yourdomain.com'; // cookie_domain要和主站点的cookie_domain一致

$db_url = 'mysqli://sub-site-db-url'; // 数据库需要和主站在同一个数据库服务器
$db_prefix = array(
  'default' => '', // 这里一定要留空,否则CCK模块可能会不能正常工作。
  'users' => 'dbname.',
  'sessions' => 'dbname.',
  'role' => 'dbname.',
  'authmap' => 'dbname.',
  'users_roles' => 'dbname.',
);

这么设置以后理论上就可以同步登录和退出了,这里主站和子站除了用户基本信息以外,其余所有信息都是各自保存的,这样做的好处就是主站子站可以分别做毫无关联的内容,只是两边共享一样的用户登录名和密码,以及登录状态。

所以子站想调用主站的数据,一般不建议直接跨数据库读取数据,最好能在主站实现API方式的数据共享。

如果主站使用的Memcache,情况就要复杂一些了,因为用户的登录状态是从Memcache中读取的,因此必须两边同时分享memcache的一些数据,那么也就意味着子站也必须安装并开启memcache模块。

$conf['memcache_servers'] = array('主站Memcache服务器IP:端口号' => 'session');
$conf['memcache_bins'] = array('users' => 'session', 'session' => 'session');
$conf['session_inc'] = './sites/all/modules/contrib/memcache/memcache-session.inc';

这样配置以后,即使主站使用了Memcache,我们仍然可以实现单点登录。但是仍然有一个小问题,就是子站无法使用Memcache了,因为Memcache模块在Drupal6中只支持一套系统,前缀也是对所有bin共享的,而这里我们是需要除了users和session bins之外的其他bin使用前缀,这么不改核心是做不到的,不过如果是开发大型Drupal项目,后期几乎很难升级,而且为了一些特殊的功能和性能需求,修改核心也是尝试。