首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Drupal 6外部认证

Drupal 6外部认证
EN

Stack Overflow用户
提问于 2011-07-06 15:24:45
回答 4查看 974关注 0票数 1

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

  • 建立外部用户数据库自动/定期复制到Drupal用户数据库的系统,该系统的优点是不会干扰Drupal的登录系统;或
  • 更改Drupal的登录系统,以便它根据这个外部数据库检查用户名和密码,然后假设(知道Drupal喜欢保持本地的东西),如果还没有创建本地帐户的话。

不过,这里的问题是,有两个用户数据库,如果其中一个更改了密码之类的信息,则在另一个数据库上不会反映这一点。Drupal需要针对外部db检查用户名和密码,而不是保存自己的密码记录。但是我也想从外部db获取一些概要信息,这会遇到重复记录的问题。

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

另一个问题是用户必须登录两次,但是Drupal站点应该是外部站点的无缝扩展,所以不喜欢登录两次。然而,这是最小的优先级,因为可能会有一条消息告诉用户“出于安全原因”再次登录。

有什么建议吗?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-29 17:42:15

我目前的做法是让Drupal针对外部DB进行身份验证,而忽略存储在Drupal中的密码。如果外部DB中不存在用户名,那么它将恢复到对Drupal的正常身份验证。

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

类似于:

代码语言:javascript
复制
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同步某些数据(或阻止编辑)。

票数 0
EN

Stack Overflow用户

发布于 2011-07-06 15:31:52

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

Drupal有一个很好的OpenID选择器实现:OpenID选择器 --与您在StackOverflow上看到的一样。

当然,这也需要您的非drupal站点转换到OpenID/OAuth,这可能不太容易。

票数 1
EN

Stack Overflow用户

发布于 2011-07-11 07:35:24

如果您有编辑外部站点的范围,那么您可以使用Drupal的服务模块编写用户登录服务,并从外部站点调用该服务。如果成功,可以从用户登录服务返回会话id。希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6598906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档