web-dev-qa-db-ja.com

Drupalのセッション管理とユーザー認証について

デフォルトのユーザー認証を中央サーバー、つまりSSOサーバーの認証に置き換える必要があるという要件があります。
デバッグによってDrupalすべてのセッション管理がincludes/session.incファイルで行われることがわかりました。画像に示すように認証を行いたい:

snap

シナリオ:ログイン
手順の詳細は次のとおりです:

  1. ログインフォームを置き換えて、ユーザー名とパスワードをSSOサーバーに送信します(Drupalではありませんですが、.NETでは)。
  2. そのサイトのデータベースを使用して、SSOサーバー上のユーザーを認証します。そして、いくつかのカスタムPHP(my website)のページ(またはモジュールによるフォーム?)に応答を送信します。
  3. 応答を使用して、usersテーブルでユーザーを識別し、パスワードをチェックせずにそのユーザーのセッションを作成します(二重認証を意味するため)。 。デフォルトでは、Drupalは$insecure_session_name変数の名前と値$sidでCookieを設定します。Drupal設定しないでくださいここではCookieを使用しますが、代わりに変数の値をSSOサーバーに送信します。
  4. SSOサーバーは値を取得してCookieを作成し、メインドメインdomain.comにドロップします(my websitesso serverの両方がメインドメインのサブドメインにあることを思い出してください) Drupalで)。次に、drupalサイトはそのCookieを使用してログインできます。

私はそれが難しい質問であることを知っています、私はどのように始めるべきかについてのポインタを探していますか?彼らは「コアをハックしてはいけない」と言っています。だから、私の質問は:

  1. Drupal認証とセッション管理が詳細に機能する方法を理解するためにどこを探すべきですか?
  2. フックを使用してincludes/session.incの関数を呼び出す方法はありますか(関数のコメントに「内部使用のみ/変更不可」と記載されているため)?

注:同じ方法を使用してユーザーを登録し、レコードがSSOサーバーの中央データベースに残るようにします。そしてその間、Drupalサイトのデータベースに同じユーザーのジャンクパスワードが入ります(ログイン時にパスワードはチェックされないため)。

17
AjitS

Drupalは外部認証をサポートしています。 OpenID(コアに含まれる)、 OAuth Connector 、または [〜#〜] ldap [〜#〜] など、Drupalには多くの代替認証モジュールがあります。 Drupal認証がどのように機能するかについての詳細をご覧ください。OpenIDとOAuthモジュールを確認し、コアログインフォーム送信コールバックを確認するのが最善です。しかし、 AFAIK、彼らは常に認証が成功した後、通常のDrupalセッションを開始します。

セッション管理の場合、DrupalはPHPセッション処理にプラグインし、独自のハンドラーを登録します。Drupalセッションバックエンドはプラグイン可能です、_session_inc_変数を、_includes/session.inc_にある関数の代替実装を提供するファイルのパスに設定できます。 memcache モジュールは、これを使用してセッションをmemcachedに保存します。

参考までに、OpenIDモジュールはopenid_authentication()自体で認証の成功を処理しceats、ユーザーログインフォーム送信ハンドラを呼び出します(つまり、user_login_submit())。この送信ハンドラ自体は単純です。user_load()を使用して認証に成功したユーザーをグローバル_$user_変数にロードし、user_login_finalize()を呼び出してセッションを処理し、userにログインタイムスタンプを付けますテーブルを作成し、hook_user_login()実装を呼び出します。

別のオプションは user_external_login_register() 関数の使用です。この関数は外部ユーザーをログインさせます。また、必要に応じてローカルユーザーを作成します。ローカルユーザーの作成をより詳細に制御する必要がある場合は、常に user_save()user_set_authmaps()user_login_submit() および user_external_load() カスタムコールから。実行する必要のあるもののテンプレートとしてuser_external_login_register()を使用します。

17
Pierre Buyle

ser_authenticate() ここでAPiが役立つかもしれません。

3.応答を使用して、usersテーブルでユーザーを識別し、パスワードをチェックせずにそのユーザーのセッションを作成します認証)。デフォルトでは、Drupalは、_$insecure_session_name_変数の名前と値_$sid_でCookieを設定します。Drupal設定しないでくださいここではCookieを使用しますが、代わりに変数の値をSSOサーバーに送信します。

編集:SSOサーバーがtrueで戻ったら、このAPIを使用してユーザーにログインし、自動的にセッションを処理します。自分でセッションを作成するのではなく、user_authenticate()を使用する方が良いと思います。有効なp-assowrdが提供されている限り、二重認証であっても問題にはなりません。

よくわかりません。両方のドメインでCookieを表示しますか?その場合、settings.phpで_$cookie_domain_をドメインに初期化します。次に、サブサイトのCookieが親サイトで使用できるようになります。

1
GoodSp33d