你在这里

共享用户数据库

原文链接:http://drupal.org/node/32179

显然,我们只有两个选择,要么让Drupal用第三方的用户数据库,要么让第三方应用来读取Drupal的用户数据表格。(如何同步的问题我们会在另一部分中讨论)我们在这一步分将讨论如何让Drupal来应用第三方的用户数据库。

首先,我们要考虑到是否我们已经有了一个现成的身份验证系统。企业级的环境一般都有采用LDAP产品的目录服务,比如openLDAP,Novell eDirectory, Microsoft Active Directory等等。如果您是在这个情况下,请参考 LDAP Integration 模块。这个模块有自己的文档

如果您找不到一个能帮助您的模块,请继续往下读。

在includes/database.inc文件中有一个很重要的位置,在那里,Drupal执行了表格前缀翻译。只要用‘{users}',您就可以重写所有用户的数据库命令,并且可以执行您自己的SQL命令。

这可以避免修改到其他drupal文件,和使所需要的修改降到最少。

您可以用和下面代码相似的方法来执行您自己的用户数据库表格操作。下面的代码被用在db_prefix_tables()的开头,它的执行将优先于Drupal执行任何其他的表格翻译。

<?php
if (strpos($sql, '{users}')) {

  if (
eregi('^update', $sql)) {
   
// someone installed a module that updates the user table
    // this is not supported, Issue and error, and quit.
   
CallCustomException();
  }
 
$DrupalUserSQL = array(
   
'@{users}@i',
   
'@= u.uid@i',
   
'@=u.uid@i',
   
'@u.uid =@i',
   
'@u.uid=@i',
   
'@u.uid@i',    // general selct
   
'@u.uid@i',    // group by
   
'@u.uid@i',    // order by
   
'@u.name@i',   // group by
   
'@u.name@i',   // order by
   
'@u.pass@i',
   
'@u.mail@i',
   
'@u.language@i',
   
'@u.picture@i',
   
'@u.picture,@i',
   
'@u.picture,@i',
   
'@u.data@i',
   
'@, u.data@i',
   
'@u.data,@i',
   
'@u.status@i');
 
$ThirdPartyUserSQL = array(
   
TABLE_PREFIX . 'user', // custom db prefix
   
'= u.userid',
   
'=u.userid',
   
'u.userid =',
   
'u.userid=',
   
'u.userid as uid',
   
'u.userid',
   
'u.userid',
   
'u.username',
   
'u.username',
   
'u.password',
   
'u.email',
   
'u.languageid',
   
'1',         // removes group/order by picture, data, status, etc.
   
'',
   
'',
   
'1',
   
'',
   
'',
   
'2');

    if (
strpos($sql, 'registered_name')) {
     
$DrupalUserSQL = array_merge(array('@u.name AS registered_name@i') , $DrupalUserSQL);
     
$ThirdPartyUserSQL = array_merge(array('u.username AS registered_name') , $ThirdPartyUserSQL);
    }
    else {
     
$DrupalUserSQL = array_merge(array('@u.name@i') , $DrupalUserSQL);
     
$ThirdPartyUserSQL = array_merge(array('u.username AS u.name') , $ThirdPartyUserSQL);
    }

   
$sql = preg_replace($DrupalUserSQL, $ThirdPartyUserSQL, $sql, 1);
?>

异常的抛出是为了标明在开发过程中drupal中的任意地点更新了users表格。异常可能继续存在,来确保其他模块测试并完成了对users表格的操作。

注意,您可能需要修改或者代替user模块,因为同时允许user模块和第三方的应用来管理用户是会有冲突的。

Module_invoke和bootstrap

如果大家感兴趣,您也可以在外部的php文件中,通过drupal的module_invoke和drupal_bootstrap方法,来调用drupal内部的方法。所以,除了共享用户数据库。您还可以对用户做出其他的整合,比如显示node内容,许块内容等等。在下面的例子里,外部的PHP文件提取了node 42中的thumbnail,以供外部的应用使用。

require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$thumbnail = module_invoke('image','display', node_load(42), 'thumbnail');