デフォルトのユーザー認証を中央サーバー、つまりSSOサーバーの認証に置き換える必要があるという要件があります。
デバッグによってDrupalすべてのセッション管理がincludes/session.inc
ファイルで行われることがわかりました。画像に示すように認証を行いたい:
シナリオ:ログイン
手順の詳細は次のとおりです:
$insecure_session_name
変数の名前と値$sid
でCookieを設定します。Drupal設定しないでくださいここではCookieを使用しますが、代わりに変数の値をSSOサーバーに送信します。domain.com
にドロップします(my website
とsso server
の両方がメインドメインのサブドメインにあることを思い出してください) Drupalで)。次に、drupalサイトはそのCookieを使用してログインできます。私はそれが難しい質問であることを知っています、私はどのように始めるべきかについてのポインタを探していますか?彼らは「コアをハックしてはいけない」と言っています。だから、私の質問は:
includes/session.inc
の関数を呼び出す方法はありますか(関数のコメントに「内部使用のみ/変更不可」と記載されているため)?注:同じ方法を使用してユーザーを登録し、レコードがSSOサーバーの中央データベースに残るようにします。そしてその間、Drupalサイトのデータベースに同じユーザーのジャンクパスワードが入ります(ログイン時にパスワードはチェックされないため)。
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()
を使用します。
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が親サイトで使用できるようになります。