2011-07-06 55 views
1

我有一个非Drupal站点,它使用简单的MySQL用户数据库进行身份验证。我想与我的Drupal站点分享那些用户信息。所以我猜想之一:Drupal 6外部身份验证

  • 有一些制度,即外部用户数据库是自动/定期复制到Drupal的用户数据库,其中有没有与Drupal的登录系统搞乱的优势;或
  • 更改Drupal的登录系统,以便根据此外部数据库检查用户名和密码,然后假定(知道Drupal喜欢将东西保留在本地)创建本地帐户(如果它尚未)。

虽然这里的问题是有两个用户数据库,并且如果密码等信息在一个上被更改,这不会反映在另一个上。 Drupal需要检查外部数据库的用户名和密码,而不是保留自己的密码记录。但我也想从外部数据库中获取一些配置文件信息,这会导致重复记录的问题。

所以我想第一个解决方案是首选,但如果脚本只设置为每小时运行一次,那么用户无法在注册外部站点一小时内登录到Drupal站点。而且它似乎是一种非常“非Drupal”的做事方式。

另一个问题是用户必须登录两次,但Drupal站点是为了无缝扩展外部站点,所以登录两次不是首选。但是,这是最不重要的,因为出于安全原因可能会有消息告诉用户再次登录。

有什么建议?

编辑:我确实有一些范围来编辑外部网站。也许更简单的方法是让外部站点通过Drupal的用户数据库进行身份验证?最好的办法似乎是如果Drupal数据库取代外部数据库,所以外部网站的用户数据库是Drupal的。或者用户只需通过Drupal登录,外部网站就知道他已经这样做了。这些听起来更简单吗?

回答

0

我目前的做法是让Drupal对外部数据库进行身份验证,并忽略存储在Drupal数据库中的密码。如果用户名不存在于外部数据库中,那么它只是恢复到通常针对Drupal数据库的身份验证。

在hook_form_user_login_alter中,您可以搜索$ form ['#validate']数组,并用您自己的函数替换user_login_authenticate_validate来检查外部数据库。

喜欢的东西:

function MYMODULE_form_user_login_alter(&$form, $form_state) { 
    $array_key = array_search('user_login_authenticate_validate', $form['#validate']); 
    if ($array_key === FALSE) { 
     $final_validator = array_pop($form['#validate']); 
      $form['#validate'][] = 'mymodule_validate'; 
      $form['#validate'][] = $final_validator; 
    } 
    else { 
     $form['#validate'][$array_key] = 'mymodule_validate'; 
    } 
} 

function mymodule_validate($form, &$form_state) { 
    if (mymodule_user_exists($form_state['values']['name'])) { 
     if (mymodule_check_password($form_state['values']['name'], $form_state['values']['pass'])) { 
      user_external_login_register($form_state['values']['name'], 'mymodule'); 
      user_authenticate_finalize($form_state['values']); 
      // maybe sync some data here 
     } 
    } 
    else { 
     user_login_authenticate_validate($form, $form_state); 
    } 
} 

您还可以使用hook_user的同步一些数据(或防止编辑)当用户注册或试图更新他们的帐户。

1

这正是我将所有内容交给OpenID/OAuth的原因。 Drupal可以是一个OpenID提供者,像这样的网站(StackOverflow)允许许多提供者。 OpenID Provider

Drupal有一个很棒的OpenID选择器实现:OpenID Selector 它与您在StackOverflow中看到的是一样的。

这当然需要你的非drupal站点转换到OpenID/OAuth,这可能不是那么容易。

+0

感谢您的建议,但不幸的是,外部网站必须保持完全不变。 –

+0

更新:实际上这不是真的 - 请参阅我在原始帖子中的编辑。 –

+0

鉴于您的编辑,您可以安装服务模块并使用Web服务来验证用户。 –

0

我在哪里工作,我们做了类似于你所描述的事情。我们有一个基于Java的后台“平台”,充当帐户信息的主要来源。平台团队为帐户创建,身份验证和更新编写了REST API。我们编写了一系列定制的Drupal模块,分别在注册,登录和帐户编辑期间与平台API交互。然而,我会警告你,它会写很多自定义代码来编写,测试和维护。

1

如果您有编辑外部网站的空间,那么您可以使用Drupal的services模块并编写您的用户登录服务并从外部站点调用该服务。如果成功,您可以从用户登录服务返回会话ID。希望这会帮助你。