Drupal 6、独自認証モジュールの作り方

このエントリーをはてなブックマークに追加
投稿者:chikunai 投稿日時:2009-04-23(木) 23:15

Drupal 6で、独自の認証を加える方法を書きます。

Drupal 6からはOpenIDがついているので、それを使うのも手です。しかし私は、既存の認証関数を利用したかったので、Drupal 6用に独自の認証モジュールを作りました。独自認証は、Usernameがユーザー名@chikunai.local の時に動くとします。改良すればドメイン名なしでもいけます。

Drupal 6では、Drupal 5にあったhook_authが無くなりました。

Distributed Authentication changes
http://drupal.org/node/114774#dist-auth

しかし、ここの説明にあるとおり、Site Networkモジュールを活用すれば、独自の認証が作れます。Site Networkモジュールは、Drupal 6で無くなったDrupalモジュールです。

Site Network
http://drupal.org/project/site_network

ではさっそくカスタマイズを進めます。

site_network.settings.inc は管理画面のファイルです。不要な項目がたくさんあるので、認証機能を有効・無効にするものだけにします。

  1. function _site_network_settings() {
  2.   $form['client'] = array(
  3.     '#description'    => t('Your Drupal site might accept logins with the user names of other Drupal sites.'),
  4.     '#title'          => t('Client'),
  5.     '#type'           => 'fieldset',
  6.   );
  7.   $form['client']['site_network_client'] = array(
  8.     '#type'           => 'checkbox',
  9.     '#title'          => t('Distributed Authentication'),
  10.     '#default_value'  => variable_get('site_network_client', FALSE),
  11.   );
  12. }

site_network.module はSite Networkモジュールの本体です。site_network_form_user_login_alter()は、ログイン画面を表示させるところです。ここを書き換えます。// Login notice 以降はいらないので削除しちゃいました。

  1. function site_network_form_user_login_alter(&$form, $form_state) {
  2.   if (variable_get('site_network_client', FALSE)) {
  3.     // Reset the validate and submit functions
  4.     module_load_include('authentication.inc', 'site_network');
  5.     array_unshift($form['#validate'], '_site_network_login_validate');
  6.   }
  7.   return $form;
  8. }

site_network_help()、site_network_menu()の文言は適当に直してください。

site_network.authentication.inc は認証のファイルになります。_site_network_login_validate()を独自の認証関数を使うように書き換えます。独自の認証のアカウント名を「アカウント名@chikunai.local」としたときは以下のとおりです。

  1. function _site_network_login_validate(&$form, &$form_state) {
  2.   if (variable_get('site_network_client', FALSE)) {
  3.     // 独自認証用関数の入ったPHPファイル
  4.     require_once('function_auth.php');
  5.  
  6.     // The username must be split in two: the first part is the
  7.     // username itself and the second is the server
  8.     $name     = explode('@', trim($form_state['values']['name']));
  9.     $username = $name[0];
  10.     $server = $name[1];
  11.  
  12.     // Check if the server is the own site
  13.     global $base_url;
  14.     $site_url = explode('://', $base_url);
  15.     if ($server == $site_url[1]) {
  16.       unset($server);
  17.     }
  18.  
  19.     // Check if the server is the own site
  20.     global $base_url;
  21.     $site_url = explode('://', $base_url);
  22.     if ($server == $site_url[1]) {
  23.       unset($server);
  24.     }
  25.  
  26.     if (!($server == 'chikunai.local' or isset($server) or $server == '')) {
  27.       // ドメインが無いときはDrupal認証
  28.       _site_network_login( $username, $form_state['values']['pass']);
  29.     }
  30.     else {
  31.       if ($server == 'chikunai.local') {
  32.         // 独自の認証関数の呼び出し
  33.         $aid = dokuji_auth( $username, $form_state['values']['pass']);
  34.       }
  35.  
  36.       // Log using the external account if the authentication succeded
  37.       if (!empty($aid)) {
  38.         // Put both username and server together again
  39.         $name = "$username@$server";
  40.  
  41.         // Check if the account already exists or its a new user
  42.         $account = user_external_load($name);
  43.         if (isset($account->uid)) {
  44.           user_external_login($account);
  45.         }
  46.         else {
  47.           user_external_login_register($name, 'site_network');
  48.         }
  49.       }
  50.       elseif (variable_get('site_network_client_server_only', FALSE)) {
  51.         // Disable the other validation processes, since it already failed
  52.         $form_state['#validate'] = array();
  53.         $form_state['#submit']  = array();
  54.  
  55.         form_set_error('name', t("Sorry, unrecognized username or password."));
  56.       }
  57.     }
  58.   }
  59.   elseif (variable_get('site_network_client_server_only', FALSE)) {
  60.     form_set_error('name', t('Server is required but not set'));
  61.   }
  62. }

この記事用に作り変えたので、動作は未確認です(汗

あとは、うまく自分たちの環境に合わせてカスタマイズください。




コメント(0)

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <table> <tr> <th> <td>
  • 行と段落は自動的に折り返されます。
  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • 次のタグを使用してソースコード構文をハイライトすることができます。: <code>, <blockcode> The supported tag styles are: <foo>, [foo].
  • You may insert videos with [video:URL]
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。

書式オプションに関するより詳しい情報...

CAPTCHA
この問題はユーザが人間であるかどうかをテストし、スパムによる自動投稿を防ぐためのものです。
Image CAPTCHA
Enter the characters shown in the image.
Drupal theme by Kiwi Themes.