Drupal 6外部认证

时间:2011-07-06 15:24:45

标签: drupal drupal-6

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

  • 有一些系统可以将外部用户数据库自动/定期复制到Drupal用户数据库中,这样做的好处是不会弄乱Drupal的登录系统;或
  • 更改Drupal的登录系统,以便它检查这个外部数据库的用户名和密码,然后大概(知道Drupal喜欢保持本地的东西)创建一个本地帐户(如果还没有)。

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

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

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

有什么建议吗?

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

4 个答案:

答案 0 :(得分:1)

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

Drupal有一个很棒的OpenID选择器实现:OpenID Selector 它与您在StackOverflow上看到的相同。

这当然要求你的非drupal网站也可以转换到OpenID / OAuth,这可能不那么容易。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我目前正在这样做的方法是让Drupal对外部数据库进行身份验证,然后忽略存储在Drupal DB中的密码。如果外部数据库中不存在用户名,则它只会恢复为正常对Drupal DB进行身份验证。

在hook_form_user_login_alter中,您可以搜索$ form ['#validu']数组,并将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来同步某些数据(或阻止编辑)。