2010-08-18 84 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函數,該函數接受參數以驗證誰在調用它,如前面的情況。

相關問題