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


16

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

スナップ

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

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

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

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

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


真のSSO(1つのサイトにログインし、すべてのサイトにログインしている)、または単に外部システムに対して認証する必要がありますか?
mpdonadio

@MPD 1つのサイトにログインし、すべてのサイトで同じユーザーを認証する必要がある真のSSOが必要です(Drupalにない場合があります
。– AjitS

@AjitS実装に成功したら、詳細な回答を記入してください。私はuser_login_finalizeを使用していますが、GDPRの問題により、Drupalに詳細を保存できないと言われています。
Jignesh Rawal

回答:


17

Drupalは外部認証をサポートしています。Drupalには、OpenID(コアに含まれる)、OAuth ConnectorLDAPなど、多くの代替認証モジュールがあります。Drupal認証の仕組みの詳細をご覧ください。最善の方法は、OpenIDおよびOAuthモジュールを見て、コアログインフォーム送信コールバックを確認することです。しかし、知る限り、認証に成功した後は常に通常のDrupalセッションを開始します。

セッション管理のために、DrupalはPHPセッション処理にプラグインし、独自のハンドラーを登録します。Drupalセッションバックエンド自体はプラグイン可能で、session_inc変数をファイルのパスに設定して、にある関数の代替実装を提供できますincludes/session.incmemcacheのモジュール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()何をすべきかのテンプレートとして。


2
これはほとんどスポットです。外部ユーザーのログインのDrupal側は驚くほど簡単です。重荷(もしあれば)は、実際には外部システムとのインターフェースです。
mpdonadio

@MPD私の特定の場合、反対を見つけます。外部システム= JSON Webサービス=比較的簡単なもの。Drupalの動作=バージョンからバージョンへの予測不可能な変更=地獄のように困難であり、問​​題が発生した場合に有用な診断はありません。
トレイカズ14

1

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

3.応答を使用して、usersテーブルでユーザーを識別し、パスワードを確認せずにそのユーザーのセッションを作成します(二重認証を意味するため)。デフォルトでは、Drupalは$insecure_session_name変数名と値を使用してCookieを設定します $sid。DrupalがここでCookieを設定しないようにし、代わりにSSOサーバーに変数の値を送信します。

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

わからない4.両方のドメインでCookieを表示しますか?その場合は、settings.phpで$cookie_domainドメインを初期化 します。その後、サブサイトのCookieが親サイトで使用可能になります。


ご回答ありがとうございます。user_authenticateDrupalサイトで認証を行う必要がないため、使用できません。私は呼び出すことで、セッションを生成することができますdrupal_session_generate()し、drupal_session_regenerate()session.incファイルから。Cookieの要件については正解です。編集をご覧ください。
AjitS

@indrockそのリンクを確認してください。User_authenticateを使用すると、ユーザー名とパスワードが正しい場合にユーザーをログインできます。手順3で、SSOサーバーでユーザー名とパスが正しいことを確認したら、このAPIを使用してユーザーにログインします。ただし、Drupalにパスワードを保存する必要があります。これを行うと、コアをハッキングするよりもはるかに簡単になります。
GoodSp33d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.