2010-08-18 86 views
2

我们必须通过使用java编写的web服务来提供“注册”方法,因此我们无法访问Drupal API。但我们需要能够成功注册用户。只需将用户添加到用户表中即可,因为新创建的用户永远无法成功登录。我再次喜欢Drupal API并总是使用它,因为这是“正确”的方式,但在这种情况下,我们只是没有教师这样做。对这种困境有何看法?如何在不使用API​​的情况下将用户注册到Drupal 6.x?

回答

2

您会想要浏览一下user_save() API函数,以了解Drupal在创建新用户时的功能。

Drupal对保存该类型数据的做法并没有什么深刻的含义:它都在数据库中。所以,虽然你不能使用Drupal API并不理想,但你实际上只处理两个数据库插入:{user}表插入(你已经完成)和{users_roles}表插入。

根据您的信息,我怀疑缺少的链接是您没有为新用户的UID在{users_roles}表中添加一行。在user_save()相关线路:

db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $account->uid, $rid); 

哪里$account->uid是新创建的用户的UID和$rid是你想给用户的角色的ID。新用户至少需要authenticated user角色。

user_save()中的其他内容主要是完整性检查(user_save()句柄更新用户,除了创建一个新用户)和钩子触发,您可能不需要担心此用例。

+0

马克,任何时候创建用户,他们然后被带到“接受条款和条件页面”。无论他们接受与否,他们似乎都无法进一步发展。 – jini 2010-08-18 06:39:01

+0

@jini,Drupal核心没有条款和条件系统:它听起来像一个contrib模块阻止登录。你会想看看他们的代码,看看它是如何验证的。很可能,您需要使用新用户的UID向该模块的表中添加一行。 – 2010-08-18 06:50:34

2

尽管Mark的方法可能是最高效的,但实现或维护起来并不容易。 Contrib模块可以在用户插入数据库时​​作出反应,如果没有Drupal,你会错过这一点,并需要手工实现每个模块。

更简单的解决方案是创建一个菜单回调,您可以从Java实现中调用。您真正需要做的就是将相关信息发布到Drupal并让其拨打user_save。它需要一个额外的请求,但是你可以得到Drupal钩子系统和一个更加可维护的解决方案,如果添加新模块,它不会中断。

为避免任何人以这种方式创建用户,可以为允许的IP创建一个设置,并在访问回调中检查被请求者的IP。这应该是最简单和最安全的解决方案,因为只有服务器才能创建用户,而暴力攻击无法成功。

1

更简单的解决方案是创建一个自定义模块,实现hook_menu()以添加从Java应用程序调用的菜单回调。
此解决方案的问题在于不安全,因为应该从匿名用户访问菜单回调;这意味着如果某人找到了菜单回调条目,那么当用户创建新帐户时(例如,Drupal可以验证他们使用的电子邮件地址是他们可以使用的邮件地址),他们可以绕过Drupal所做的检查来创建新用户。这就是为什么你永远不应该有一个phpinfo.php文件返回phpinfo()的输出,这是每个人都可以访问的原因。
解决方法是传递给菜单回调您创建了一个其他用户无法猜测的参数; Drupal 7会这样做,以避免随机用户调用cron.php,导致Drupal驱动的站点变慢,或导致其他问题。Drupal有一个函数返回一个不可预测的值,这个值取决于Drupal的安装(drupal_get_token())。

另一种方法是在自定义代码中实现hook_xmlrpc(),并公开一个新的RPC函数,该函数接受参数以验证谁在调用它,如前面的情况。

相关问题