ホーム > フォーラム > 質問箱 > XCL2.1.6 > LDAP対応につきまして

LDAP対応につきまして
投稿者: drufyi | 投稿日時: 2009/1/6 20:46 | 閲覧: 21405回
drufyi
こんにちは。

現在ダウンロードできる、Package_Legacy_2_1_6は、
LDAPに対応しておりますでしょうか?

また、LDAPを利用する為にモジュール等、拡張が必要でしょうか?

参考になるサイト等があればご教示願えれば幸いです。

以上、よろしく御願い致します。

コメント(7)

新しいものから | 古いものから | ネスト表示 | RSS feed
Re: LDAP対応につきまして 
投稿者: onokazu | 投稿日時: 2009/1/7 1:45
onokazu
LDAP対応に関してですが、2.1.6のコア自体が対応しているとは言えないと思います。

また、LDAPに関してはどのような利用を想定されているのでしょうか?
ユーザ認証のみをLDAPに行わせて、それ以外のユーザ情報の管理はXCL
側で行うのか、それとも全てのユーザ情報の管理をLDAP側で行いたいのでしょうか?

前者は外部認証モジュール等がありますので、そのモジュールの作者にかけあえば
作ってもらえるかもしれません。また、当サイトでも外部認証をプラグイン形式で
自由に追加できるようなシステムを構築していますが、認証部分のみをLDAPで行い、
その認証情報を既存のXCLアカウントまたは新規アカウントへと紐付けるように
させるようなことはプラグイン経由で簡単に実装できます。

後者に関しては今のところXCLでは難しいと思います。できないことはないですが、
XCLのインストール部分から色々とハックが必要になると思います。
Re: LDAP対応につきまして 
投稿者: drufyi | 投稿日時: 2009/1/7 8:51 | 親コメント: #19426
drufyi
ご回答ありがとうございます。

>また、LDAPに関してはどのような利用を想定されているのでしょうか?

 ご呈示頂いた、2点ですと 完全にLDAPのみで認証を行いたかったです。。

 ということは現状では1からになり厳しいということですか。

 うーん、困りました。


LDAP対応に関してですが、2.1.6のコア自体が対応しているとは言えないと思います。

また、LDAPに関してはどのような利用を想定されているのでしょうか?
ユーザ認証のみをLDAPに行わせて、それ以外のユーザ情報の管理はXCL
側で行うのか、それとも全てのユーザ情報の管理をLDAP側で行いたいのでしょうか?

前者は外部認証モジュール等がありますので、そのモジュールの作者にかけあえば
作ってもらえるかもしれません。また、当サイトでも外部認証をプラグイン形式で
自由に追加できるようなシステムを構築していますが、認証部分のみをLDAPで行い、
その認証情報を既存のXCLアカウントまたは新規アカウントへと紐付けるように
させるようなことはプラグイン経由で簡単に実装できます。

後者に関しては今のところXCLでは難しいと思います。できないことはないですが、
XCLのインストール部分から色々とハックが必要になると思います。
Re: LDAP対応につきまして 
投稿者: hagane | 投稿日時: 2009/1/8 15:31
hagane
LDAP認証については、認証に関わる次のファイル内の処理を少し修正すれば対応します。

modules/legacy/kernel/handler.php
***************
*** 373,377 ****
--- 373,476 ----

                return $flag;
        }
+
+     /**
+      * Return array of object with $criteria.
+      *
+      * @access public
+      * @param CriteriaElement $criteria
+      * @param bool $id_as_key
+      *
+      * @return array
+      */
+     function &LDAPAuth($criteria = null, $id_as_key = false)
+     {
+       $authenticated = false;
+
+       if ($criteria != null && is_a($criteria, 'CriteriaElement')) {
+
+       $uname = $criteria->getChildElement(0)->getValue();
+       $pass = $criteria->getChildElement(1)->getValue();
+
+       $uid_attr = "uid=".$uname;
+       $uid_number = "uidnumber";
+       $mail_attr = "mail";
+       $name_attr = "cn";
+       $pass_attr = "userpassword";
+       $objectclass_attr = "objectclass=Staff";
+       $ldap_server = "LDAP サーバのアドレス";
+       $ldap_port = 389;
+       $base_dn = "ou=Users,dc=hkg,dc=ac,dc=jp";
+       $timezone_offset = 9;
+
+
+       $ds = ldap_connect($ldap_server, $ldap_port)
+               or die("Could not connect to LDAP server.");
+
+       if ($ds) {
+             //Authentication
+
+             $ldapbind = ldap_bind($ds,$uid_attr.",".$base_dn,$pass);
+             if ($ldapbind) {
+               // Get info from LDAP (mail,name)
+               //$filter = "(&(".$uid_attr.")(".$objectclass_attr."))";
+               $filter = $uid_attr;
+               $sr = ldap_search($ds,$base_dn,$filter,Array($name_attr,$pass_at
tr,$uid_number));
+               $info = ldap_get_entries($ds, $sr);
+               if ($info["count"] == 1) {
+
+                 $authenticated = true;
+
+                 // Search user in the DB
+                 $criteria =& new Criteria('uname',$uname);
+                 $user =& $this->getObjects($criteria, false);
+
+                 if (count($user) <= 0) {
+
+                   $memberHandler =& xoops_gethandler('member');
+
+                   $NewUser =& $memberHandler->createUser();
+                   $NewUser->setVar("uname",$uname);
+                   $NewUser->setVar("user_avatar","blank.gif");
+                   $NewUser->setVar('user_regdate', time());
+                   $NewUser->setVar('timezone_offset', $timezone_offset);
+                   $NewUser->setVar('actkey',substr(md5(uniqid(mt_rand(), 1)),
0, 8));
+                   $NewUser->setVar("uid",$info[0][$uid_number][0]);
+                   $NewUser->setVar("name",$info[0][$name_attr][0]);
+                   $NewUser->setVar("pass",md5($pass));
+
+                   $NewUser->setVar("level",1);
+                   $NewUser->setVar('notify_method', 2);
+                   /* 作成したい情報にあわせて適当に編集
+                   if (strlen($info[0][$mail_attr][0])<=0) {
+                     $NewUser->setVar("email",$info[0][$name_attr][0]."@");
+                   }
+                   else {
+                     $NewUser->setVar("email",$info[0][$mail_attr][0]);
+                   }
+                   */
+                   $NewUser->setVar("email",$uname.'@');
+
+                     // Store info in DB (insert or update)
+                   $memberHandler->insertUser($NewUser);
+
+                   //Add the user to Registered Users group
+                   $memberHandler->addUserToGroup(XOOPS_GROUP_USERS, $NewUser->
get('uid'));
+                 }
+                 else {
+                   $NewUser =& $user[0];
+                 }
+               }
+             }
+             ldap_close($ds);
+           }
+           else {
+               echo "cannot connect to ldap server";
+           }
+       }
+       return $authenticated;
+     }
  }
  ?>


modules/user/class/users.php
*** 122,127 ****
--- 122,133 ----
                return $objects;
        }

+       function &LDAPAuth($criteria = null, $limit = null, $start = null, $id_a
s_key = false)
+       {
+               $objects =& parent::LDAPAuth($criteria, $limit, $start, $id_as_k
ey);
+               return $objects;
+       }
+
        /**
         * Return the array which consists of an integer as the uid. This member
         * function is more speedy than getObjects().

modules/user/kernel/LegacypageFunctions.class.php
                $root->mLanguageManager->loadModuleMessageCatalog('user');

                $userHandler =& xoops_getmodulehandler('users', 'user');

                $criteria =& new CriteriaCompo();
!               $criteria->add(new Criteria('uname', xoops_getrequest('uname')))
;
!               $criteria->add(new Criteria('pass', md5(xoops_getrequest('pass')
)));

                $userArr =& $userHandler->getObjects($criteria);

--- 228,246 ----
                $root->mLanguageManager->loadModuleMessageCatalog('user');

                $userHandler =& xoops_getmodulehandler('users', 'user');
+
+               $uname = xoops_getrequest('uname');
+               $pass = xoops_getrequest('pass');
+
+               $ldap_criteria =& new CriteriaCompo();
+               $ldap_criteria->add(new Criteria('uname', $uname));
+               $ldap_criteria->add(new Criteria('pass', ($pass)));
+
+               $userArr =& $userHandler->LDAPAuth($ldap_criteria);

                $criteria =& new CriteriaCompo();
!               $criteria->add(new Criteria('uname', $uname));
!               $criteria->add(new Criteria('pass', md5($pass)));

                $userArr =& $userHandler->getObjects($criteria);
Re: LDAP対応につきまして 
投稿者: hagane | 投稿日時: 2009/1/8 15:38 | 親コメント: #19435
hagane
詳しい情報は、こちらの記事を御覧ください。

http://www.xoops.org/modules/newbb/viewtopic.php?topic_id=12752&forum=14&post_id=53576
Re: LDAP対応につきまして 
投稿者: onokazu | 投稿日時: 2009/1/8 16:40 | 親コメント: #19435
onokazu
haganeさん、ありがとうございます。コードの部分を[ code][/code ]でくくらせていただきました。

ldapは使ったことないのでよく分かっていませんが、いただいたコードを参考に外部認証を作ってみたいと思います。流れとしてはldap_bindで認証を行い、可能であればldap_searchで追加の情報を取得という感じでしょうか。
Re: LDAP対応につきまして 
投稿者: kisara_icy | 投稿日時: 2009/1/9 8:29 | 親コメント: #19426
kisara_icy


前者は外部認証モジュール等がありますので、そのモジュールの作者にかけあえば
作ってもらえるかもしれません。また、当サイトでも外部認証をプラグイン形式で
自由に追加できるようなシステムを構築していますが、認証部分のみをLDAPで行い、
その認証情報を既存のXCLアカウントまたは新規アカウントへと紐付けるように
させるようなことはプラグイン経由で簡単に実装できます。


ども、外部認証モジュール作者です(^^

LDAPは要望があるので対応させたいのですが、LDAP自体の環境がうまく構築できてないのでちょっと手が付けられてません。申し訳ない。

あと、昔LDAPをモジュールで作られた方がいたと思います。
使ったことはありませんが、こちらを参考にしてみてはどうでしょう。

http://xoopscube.jp/forum/3550?comment_id=12132
Re: LDAP対応につきまして 
投稿者: drufyi | 投稿日時: 2009/1/9 11:55 | 親コメント: #19438
drufyi
皆様、ご返信誠にありがとうございます。

参考頂いたものを参照させて頂きながら、
評価をしてみたいと思います。

良い報告ができれば良いのですが。。

また有効なご教示がございましたら何卒よろしく御願い致します。

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top