2011-07-06 92 views
1

我有一個非Drupal站點,它使用簡單的MySQL用戶數據庫進行身份驗證。我想與我的Drupal站點分享那些用戶信息。所以我猜想之一:Drupal 6外部身份驗證

  • 有一些制度,即外部用戶數據庫是自動/定期複製到Drupal的用戶數據庫,其中有沒有與Drupal的登錄系統搞亂的優勢;或
  • 更改Drupal的登錄系統,以便根據此外部數據庫檢查用戶名和密碼,然後假定(知道Drupal喜歡將東西保留在本地)創建本地帳戶(如果它尚未)。

雖然這裏的問題是有兩個用戶數據庫,並且如果密碼等信息在一個上被更改,這不會反映在另一個上。 Drupal需要檢查外部數據庫的用戶名和密碼,而不是保留自己的密碼記錄。但我也想從外部數據庫中獲取一些配置文件信息,這會導致重複記錄的問題。

所以我想第一個解決方案是首選,但如果腳本只設置爲每小時運行一次,那麼用戶無法在註冊外部站點一小時內登錄到Drupal站點。而且它似乎是一種非常「非Drupal」的做事方式。

另一個問題是用戶必須登錄兩次,但Drupal站點是爲了無縫擴展外部站點,所以登錄兩次不是首選。但是,這是最不重要的,因爲出於安全原因可能會有消息告訴用戶再次登錄。

有什麼建議?

編輯:我確實有一些範圍來編輯外部網站。也許更簡單的方法是讓外部站點通過Drupal的用戶數據庫進行身份驗證?最好的辦法似乎是如果Drupal數據庫取代外部數據庫,所以外部網站的用戶數據庫是Drupal的。或者用戶只需通過Drupal登錄,外部網站就知道他已經這樣做了。這些聽起來更簡單嗎?

回答

0

我目前的做法是讓Drupal對外部數據庫進行身份驗證,並忽略存儲在Drupal數據庫中的密碼。如果用戶名不存在於外部數據庫中,那麼它只是恢復到通常針對Drupal數據庫的身份驗證。

在hook_form_user_login_alter中,您可以搜索$ form ['#validate']數組,並用您自己的函數替換user_login_authenticate_validate來檢查外部數據庫。

喜歡的東西:

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的同步一些數據(或防止編輯)當用戶註冊或試圖更新他們的帳戶。

1

這正是我將所有內容交給OpenID/OAuth的原因。 Drupal可以是一個OpenID提供者,像這樣的網站(StackOverflow)允許許多提供者。 OpenID Provider

Drupal有一個很棒的OpenID選擇器實現:OpenID Selector 它與您在StackOverflow中看到的是一樣的。

這當然需要你的非drupal站點轉換到OpenID/OAuth,這可能不是那麼容易。

+0

感謝您的建議,但不幸的是,外部網站必須保持完全不變。 –

+0

更新:實際上這不是真的 - 請參閱我在原始帖子中的編輯。 –

+0

鑑於您的編輯,您可以安裝服務模塊並使用Web服務來驗證用戶。 –

0

我在哪裏工作,我們做了類似於你所描述的事情。我們有一個基於Java的後臺「平臺」,充當帳戶信息的主要來源。平臺團隊爲帳戶創建,身份驗證和更新編寫了REST API。我們編寫了一系列定製的Drupal模塊,分別在註冊,登錄和帳戶編輯期間與平臺API交互。然而,我會警告你,它會寫很多自定義代碼來編寫,測試和維護。

1

如果您有編輯外部網站的空間,那麼您可以使用Drupal的services模塊並編寫您的用戶登錄服務並從外部站點調用該服務。如果成功,您可以從用戶登錄服務返回會話ID。希望這會幫助你。