当前位置

Drupal多站点共用用户数据库

James Qi 在 2015年3月26日 - 14:59 提交
内容摘要:我们以前做的系列Drupal网站一般都是共享代码目录、分开创建独立的数据库,因为一般都是禁止匿名用户注册的,所以只是最初设立几个管理员就可以,也还方便。不过为了考虑以后开放用户注册,系列网站的共享用户......

  我们以前做的系列Drupal网站一般都是共享代码目录、分开创建独立的数据库,因为一般都是禁止匿名用户注册的,所以只是最初设立几个管理员就可以,也还方便。不过为了考虑以后开放用户注册,系列网站的共享用户数据库就有必要了。今天去尝试了一些,可以比较方便地在settings.php中进行如下设置:

Drupal 7:

$databases['default']['default']['prefix']['default'] = '';
$databases['default']['default']['prefix']['users'] = 'mingluji_com.';
$databases['default']['default']['prefix']['users_roles'] = 'mingluji_com.';
$databases['default']['default']['prefix']['sessions'] = 'mingluji_com.';
$databases['default']['default']['prefix']['role'] = 'mingluji_com.';
$databases['default']['default']['prefix']['authmap'] = 'mingluji_com.';
$cookie_domain = '.mingluji.com'; 

或者写为:

$databases = array( 
  'default' => array(
    'default' => array(
      'prefix' => array(
        'default' => '',
        'users' => 'mingluji_com.',
        'sessions' => 'mingluji_com.',
        'role' => 'mingluji_com.',
        'authmap' => 'mingluji_com.',
        'users_roles' => 'mingluji_com.',
      ),
    ),
  ),
);

$cookie_domain = '.mingluji.com';

Drupal 6:

$db_prefix['default'] = '';
$db_prefix['users'] = 'mingluji_com.';
$db_prefix['sessions'] = 'mingluji_com.';
$db_prefix['role'] = 'mingluji_com.';
$db_prefix['authmap'] = 'mingluji_com.';
$db_prefix['users_roles'] = 'mingluji_com.';
$cookie_domain = '.mingluji.com';

或写为:

$db_prefix = array(
  'default'   => '',
  'users'     => 'mingluji_com.',
  'sessions'  => 'mingluji_com.',
  'role'      => 'mingluji_com.',
  'authmap'   => 'mingluji_com.',
  'users_roles' => 'mingluji_com.',
);
$cookie_domain = '.mingluji.com';

  可以做到一个系列或者同一台服务器上Drupal站点共用用户数据库,跨服务器还不行,这和mediawiki类似,wiki站也是同一台服务器上的用户库可以共享。

  《drupal建立多站点共享用户数据》  这篇文章介绍还比较详细,可以参考。


  补充:在设置共享用户数据库之前,最好先检查一遍以前的用户设置情况,可能有用户uid不同的情况,以及可能有入侵账号的情况。可以批量运行下面这句看看:

drush user-information 1,2,3,4,5

  1一般都是James Qi,因为是我最初设置的
  2或者3一般是Webmaster,这是设置的第一个用户,但有的是2,有的是3
  4或者5一般应该不存在,会报错,如果有用户就可能是入侵的

  drupal 6/7运行上面这句还有点不一样,drupal 6运行如果遇到报错就只报错不显示找到的其它的,drupal 7运行如果遇到报错除了报错以外也显示找到的其它的。如果4、5报错不显示的话,先排除有4、5的可能,再运行drush user-information 1,2,3。

  如果整个系列的各个站点运行的结果全部是统一的,例如:

  1是James Qi
  3是Webmaster
  2,4,5不存在

  那就直接合并就可以,不会有问题。

  如果运行结果不统一,例如有些站点Webmaster是2,有些站点是3,那就还需要特别处理一下,在合并后的用户数据表中把uid=2和uid=3都加上用户,否则缺了某一个用户可能造成这个用户编辑的页面报错(找不到对应的用户名)。这在drupal7.mingluji.com这个系列合并用户数据库的时候就遇到,因为各届广交会的站点不是统一建的,有些用户uid不统一。 Webmaster ID不统一的问题还有一个办法,在drupal 6/7的操作中直接在phpmyadmin中修改users表,把Webmaster的uid改为2,另外在users_roles表中,也把对应的uid改为2,再在node表和node_revisions这两个表中,搜索uid=以前数字的,也改为2,这样就全部改完了,再进行合并不会有问题。

  如果找到4、5等其它的账号(例如:User ID:  3,User name:  drupaldev,User roles:  authenticated user megauser,这个3是入侵的,我们自己没有设置过drupaldev,也没有megauser这个组),要去看看,把这些入侵的账号屏蔽或者删除掉(drush user-block屏蔽用户、drush user-cancel删除用户、drush user-remove-role去掉角色组)。多余的注册用户也可能是这个站开始设置网站的时候,还没有来得及关闭注册,就有一些注册的了,正常注册过的用户可以忽略掉,应该不多,而且他们也无法发布内容和评论,都是几年前注册的,可以删除,也可以屏蔽,或者搁置不管。

  另外,再在合并后统一用户数据库的站点上设置一个action和对应的trigger,当有新用户注册的时候会发邮件通知管理员,这样就可以防止以后被入侵后还不知道。


  2015-7-9补充:还有表可以合并:role_permission,但如果系列站之间需要设置的权限不一样的话(例如子站与总站之间开启的模块不一致的情况下),那还不能合并。

  另外,devel排查性能发现多语言网站对locales_source、locales_target的查询特别多而且慢,可以把系列站的这两个表也合并。

自由标签: