我有一个非Drupal站点,它使用简单的MySQL用户数据库进行身份验证 . 我想与Drupal网站分享该用户信息 . 所以我猜:
-
有一些系统,外部用户数据库自动/定期复制到Drupal用户数据库,这样做的好处是不会弄乱Drupal的登录系统;要么
-
已经改变Drupal 's login system so it checks the username and password against this external database and then presumably (knowing that Drupal likes to keep things local) creating a local account if it hasn' .
这里的问题是,有两个用户数据库,如果密码等信息在一个上发生变化,则不反映在另一个上 . Drupal需要检查外部数据库的用户名和密码,而不是保留自己的密码记录 . 但我也想从外部数据库中获取一些配置文件信息,这会遇到重复记录的问题 .
所以我想第一个解决方案是首选的,但是如果脚本只设置为每小时运行一次,那么用户无法在注册外部网站的一小时内登录Drupal站点 . 它似乎也是一种非“非Drupal”的做事方式 .
另一个问题是用户必须登录两次,但Drupal站点是外部站点的无缝扩展,因此不首选登录两次 . 但是,这是最不重要的,因为可能会有消息告诉用户“出于安全原因”再次登录 .
有什么建议??
EDIT: 我确实有一些编辑外部网站的范围 . 也许更简单的方法是让外部站点通过Drupal 's user db? The best way seems to be if the Drupal db replaces the external db so the external site'用户db IS Drupal进行身份验证 . 或者用户只需通过Drupal登录,外部网站就知道他已经这样做了 . 这些听起来更简单吗?
4 回答
我目前正在这样做的方法是让Drupal对外部数据库进行身份验证,然后忽略存储在Drupal DB中的密码 . 如果外部数据库中不存在用户名,则它只会恢复为正常对Drupal DB进行身份验证 .
在hook_form_user_login_alter中,您可以搜索$ form ['#validate']数组,并将user_login_authenticate_validate替换为您自己检查外部数据库的函数 .
就像是:
当用户注册或尝试更新其帐户时,您还可以使用hook_user来同步某些数据(或阻止编辑) .
这正是我将所有内容交给OpenID / OAuth的原因 . Drupal可以是OpenID提供者,像这样的站点(StackOverflow)允许许多提供者 . OpenID Provider
Drupal有一个很棒的OpenID选择器实现:OpenID Selector它与你在StackOverflow上看到的相同 .
这当然要求您的非drupal站点也要转换到OpenID / OAuth,这可能不那么容易 .
如果您有编辑外部站点的范围,那么您可以使用Drupal的services模块并编写您的用户登录服务并从外部站点调用该服务 . 如果成功,您可以从用户登录服务返回会话ID . 希望这会帮助你 .
在我工作的地方,我们做了类似于你所描述的事情 . 我们有一个基于Java的后端“平台”,它充当了帐户信息的主要来源 . 平台团队为帐户创建,身份验证和更新编写了一个REST API . 我们编写了一系列自定义Drupal模块,分别在注册,登录和帐户编辑过程中与平台API进行交互 . 我会警告你,但事实证明,编写,测试和维护的自定义代码很多 .