2011-12-15 17 views
2

私は簡単なDrupal Webサイトをセットアップし、完了に近づいています。
このウェブサイトは、ポップアップボックスを除いて完全にロックする必要があります。ログインすることはできますが、ログインはDrupalの標準認証を経由しないようにしてください。代わりにユーザー名とパスワードをログインの成功または失敗に対して、trueまたはfalseを返すWebサービス。Webサービス認証を使用したDrupal

私はポップアップを作成することができますが、Webサービスを通じて認証をルーティングする方法と、ログインせずに直接リンクを停止するセッションを開く方法は、その人が親に登録されていることですサイト(Webサービスを提供した人)。

答えて

3

ステップ1は新しいモジュールを作成することです。

私はこの参照が有用であることが判明:http://yetanotherprogrammingblog.com/node/14

この溶液をDrupalの-6に基づくものです。違いがあります。

このモジュールでは、hook_login_validateを上書きする必要があります。例えばあなたはタイトルに_use_webservice_loginで関数を作成する必要があります

  • ことは、上記ノートで

    function mymodule_login_validate($form, &$form_state) { 
        $username = $form_state['values']['name']; 
    
        // do if condition to see if your authentication is required. 
        // e.g. you might want to keep the drupal administration users. 
        if (_mymodule_use_webservice_login($username)) { 
        // We are logging in using service. 
        if (_mymodule_validate_password($username, $form_state['values']['pass']) { 
         user_external_login_register($username, 'mymodule'); 
         user_authenticate_finalize($form_state['values']; 
        } // else drop through to the end and return nothing - Drupal will handle the rejection for us 
        } 
    } else { 
        // Username is not an member number, so use standard Drupal authentication function 
        user_login_authenticate_validate($form, &$form_state); 
    } 
    

    。 RESTサービスに行くかどうかをテストします。私は名前空間の健全性のためにこれらをPHPクラスに入れたい。

  • 資格情報テストを行う機能を作成する必要があります。 _mymodule_validate_passwordこれはあなたのサービスに行きます。
  • 普通のdrupalと同じように、 'mymodule'をあなたが作成するモジュールの名前に変更して、名前空間の衝突がないようにします。

私はサービスを呼び出すためにgrails(spring/java)アプリケーションに接続していました。これは主にmakeと変数の呼び出しを決定します。私は組み込みのgrails認証サービスを使って認証を行い、それを上書きしてカスタム認証を行います。休憩サービスに反対するコールは、似ているはずです。 httpリクエストが必要で、レスポンスを解析します。

_mymodule_validate_passwordをやって、私のPHPクラスからの抜粋です:一日の終わりに

$headers = array(
     'Content-Type' => 'application/x-www-form-urlencoded', 
     'X-Requested-With' => 'XMLHttpRequest', 
    ); 

    // _spring_security_remember_me 
    $data = array(
     'j_username' => urlencode($username), 
     'j_password' => urlencode($password), 
     '_spring_security_remember_me' => 'on', 
    ); 

    $query_string = http_build_query($data, '', '&'); 

    // WARNING - API changes in drupal 7 
    // CAUTION - don't allow it to retry. Grails gives us a redirect which drupal_http_request follows, losing the cookie 
    $response = drupal_http_request($endpoint_url, $headers, 'POST', $query_string, 0); 

    // Did the initial login succeed. 
    if ($response->code != 200 && $response->code != 302) { 
     watchdog(self::module_name, self::module_name, 'Failed to log in %error.', array('%error' => $response->status_message)); 
     // FAIL 
     return false; 
    } 

    // Initial login success. Follow the redirect. 
    // Redirected request. Look for 200 && {"success":true,"username":"888"} 
    $redirect_response = drupal_http_request($response->redirect_url, array(), 'GET', NULL); 

    // The true success criteria 
    if ($redirect_response->code == 200 && array_key_exists('Set-Cookie', $response->headers)) { 
     // Authentication worked. 
     $response_data = json_decode($redirect_response->data); 
     if (property_exists($response_data, 'success') && $response_data->success && 
       property_exists($response_data, 'username')) { 
      $login_success = true; 
     } else { 
      return false; 
     } 

私の要求は私にJSON {:真、 "ユーザ名": "888" "成功"}を与えます。ユーザー名は余分です。

Grailsは、データを提供するサービスに対して認証された場合、リダイレクトを行います。 Webサービスから「200」が返ってきたことを確認して、JSONデータに「成功」​​と同等のものがあるかどうかを確認するだけです。上記の場合、認証を確認し、リダイレクトを記録し、リダイレクトを呼び出して認証データを取得します。

サービスから基本的なDrupalプロファイル情報を返し、詳細を設定できます。 mymodule_userをオーバーライドして、更新のコールバックを投稿するためのアクセス権を取得します。バックエンドがデータの主要なソースなので、すべてのログインの詳細を更新します。この記事の一番上にある「更新」を参照してください。あなたはここで終わらないかもしれない楽しみをやろうとしている内容に応じて

function mymodule_user($type, &$edit, &$account, $category = null) { 
    switch ($type) { 


    case 'login' : 
     // Login should theoretically fail if the details don't get set. 
     ... whatever you have to do to get the details. I call my class. 
     user_save($account, array('mail' => $fedAuth->email_address)); 
    case 'logout' : 
     // remove the grails cookies. 

} 

}

。私の場合は、カスタムプロファイル情報を更新し、後続のWebサービスコールのログイン詳細を記録するためにクライアントクッキーを保存する必要がありました。 DrupalセッションとWebサービスプロバイダのセッションがあるので、これは「安らか」ではないと主張する人もいます。

関連する問題