我们必须通过使用java编写的web服务来提供“注册”方法,因此我们无法访问Drupal API。但我们需要能够成功注册用户。只需将用户添加到用户表中即可,因为新创建的用户永远无法成功登录。我再次喜欢Drupal API并总是使用它,因为这是“正确”的方式,但在这种情况下,我们只是没有教师这样做。对这种困境有何看法?如何在不使用API的情况下将用户注册到Drupal 6.x?
回答
您会想要浏览一下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()
句柄更新用户,除了创建一个新用户)和钩子触发,您可能不需要担心此用例。
尽管Mark的方法可能是最高效的,但实现或维护起来并不容易。 Contrib模块可以在用户插入数据库时作出反应,如果没有Drupal,你会错过这一点,并需要手工实现每个模块。
更简单的解决方案是创建一个菜单回调,您可以从Java实现中调用。您真正需要做的就是将相关信息发布到Drupal并让其拨打user_save
。它需要一个额外的请求,但是你可以得到Drupal钩子系统和一个更加可维护的解决方案,如果添加新模块,它不会中断。
为避免任何人以这种方式创建用户,可以为允许的IP创建一个设置,并在访问回调中检查被请求者的IP。这应该是最简单和最安全的解决方案,因为只有服务器才能创建用户,而暴力攻击无法成功。
更简单的解决方案是创建一个自定义模块,实现hook_menu()
以添加从Java应用程序调用的菜单回调。
此解决方案的问题在于不安全,因为应该从匿名用户访问菜单回调;这意味着如果某人找到了菜单回调条目,那么当用户创建新帐户时(例如,Drupal可以验证他们使用的电子邮件地址是他们可以使用的邮件地址),他们可以绕过Drupal所做的检查来创建新用户。这就是为什么你永远不应该有一个phpinfo.php
文件返回phpinfo()
的输出,这是每个人都可以访问的原因。
解决方法是传递给菜单回调您创建了一个其他用户无法猜测的参数; Drupal 7会这样做,以避免随机用户调用cron.php,导致Drupal驱动的站点变慢,或导致其他问题。Drupal有一个函数返回一个不可预测的值,这个值取决于Drupal的安装(drupal_get_token()
)。
另一种方法是在自定义代码中实现hook_xmlrpc()
,并公开一个新的RPC函数,该函数接受参数以验证谁在调用它,如前面的情况。
- 1. 如何在Drupal 6.x中手动注册用户?
- 2. 如何在不使用Drupal的情况下使用Drupal 7表单API?
- 3. 如何在不使用vsdrfcomselfreg的情况下注册DLL
- 4. ROR如何在没有注册的情况下记住用户?
- 5. 如何在不注册的情况下存储有关用户的信息?
- 6. 如何使phplist注册表单将用户返回到Drupal?
- 7. Yii2如何在不使用此插件的情况下注册Plugin? )
- 8. 如何在用户名不可用的情况下在注册期间建议替代用户名?
- 9. 在没有注册帐户的情况下识别应用程序的用户
- 10. 如何在不使用弃用API的情况下将图片上传到某个Picasa网络相册?
- 11. 推荐的注册表使用情况
- 12. Drupal注册用户页面?
- 13. 如何在不使用onClick的情况下关注Javascript链接
- 14. 如何在不使用setCoordinate的情况下更新注释?
- 15. 如何在不使用Membership.CreateUser()的情况下创建用户?
- 16. 重写用户注册表单在Drupal 6
- 17. 如何在未注册的情况下在FOSUserBundle中使用邮件程序?
- 18. 如何在不强制用户注册的情况下对用户进行身份验证?
- 19. 在不使用onload(IE)的情况下将css注入页面?
- 20. 如何在不使用表单或网页的情况下在我的MVC 5 Web App上注册帐户?
- 21. 用户注册(注册)的Wordpress REST API
- 22. 如何在不使用OAuth的情况下制作安全API?
- 23. 如何在不注册应用程序的情况下测试游戏中心?
- 24. 允许注册用户在未登录的情况下访问其帐户
- 25. Ansible,如何仅在用户存在的情况下将用户添加到组
- 26. 在不使用oReg.EnumKey的情况下在VBS中创建注册表键阵列
- 27. 如何在不使用https重定向的情况下使用AWS API网关
- 28. 如何添加语言切换用户/注册形式在Drupal 6
- 29. 如何在不使用地图的情况下找到用户的位置android
- 30. 如何在不使用Interop的情况下将VBA代码注入Excel .xlsm?
马克,任何时候创建用户,他们然后被带到“接受条款和条件页面”。无论他们接受与否,他们似乎都无法进一步发展。 – jini 2010-08-18 06:39:01
@jini,Drupal核心没有条款和条件系统:它听起来像一个contrib模块阻止登录。你会想看看他们的代码,看看它是如何验证的。很可能,您需要使用新用户的UID向该模块的表中添加一行。 – 2010-08-18 06:50:34