ldapldapを使い始める

備考

この節では、ldapの概要と開発者がなぜそれを使いたいのかを概説します。

また、ldap内の大きなテーマについても言及し、関連するトピックにリンクする必要があります。 ldapのドキュメントは新しくなっているので、これらの関連トピックの初期バージョンを作成する必要があります。

LDAPで動作するようにPHPを設定する

LDAPサーバーを正しく構成したら、今すぐ接続します。たとえば、PHPを使用します。

  • DN =識別名。これは、データベースのどの部分で作業しているかを意味します。ユーザーまたはグループ(または設定の設定)でもかまいません。
  • エントリ:エンティティ、例えばユーザ。
  • 属性:名前、電話番号、電子メールアドレスなど、エントリ内の何か。

接続する

まず、次のように定義します。

$server = "server.example.com";  //this is the LDAP server you're connecting with
$ds = ldap_connect("ldaps://$server", 636); //always connect securely via LDAPS when possible

さて、私たちはつながっています。私たちが望む次のことは、私たちが信頼できる人であることをサーバーに知らせることです。最も簡単な解決策は、データベースを表示するための適切な権限を持つ既存のユーザーまたはルートDNを使用することです(おそらくデータベース内のすべてのユーザーがこれをデフォルトで実行できます)。バインド機能を使用して認証します。

オプションを設定する

まず、これらのオプションを宣言します。サーバーの構成によっては、このままにすることができます。

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

バインディング

adminとpasswordを使用していると仮定しますpass123notsafe

$dn = "uid=admin,cn=users,dc=server,dc=example,dc=com";
$pass = "pass123notsafe";
$ldapbind = ldap_bind($ds, $dn, $pass); //this is the point we are authenticating

それはとてもいいです。私たちは入っています。今では、多くの異なる操作を実行できます。たとえば、ユーザーやグループを検索、読み取り、書き込み、変更することができます。

検索

グループ「ユーザー」のすべてのメンバーを表示するとします。

$dn = "cn=users,dc=server,dc=example,dc=com"; //very important: in which part of your database are you looking
$filter = "uid=*"; //don't filter anyone out (every user has a uid)
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

$results = ldap_get_entries($ds, $sr); //here we are pulling the actual entries from the search we just defined
var_dump($results); //will give you all results is array form. 

foreachループを使用すると、データをうまく表示できます。

さて、これを持っていますか?今度はいくつかのフィルタリングを行います。私たちは、メールアドレスを登録したグループ "bikeowners"にユーザーだけを表示したいと考えています。 すべてのユーザーがcn = usersにいることを知ることは重要です。この後、他のグループのメンバーになることもできます。

//did the connecting and binding

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com"; //note the extra "cn=groups" for looking in a group that is not "users"
$filter = "email=*"; //email address must be set but can be anything
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

そしてldap_get_entriesもう一度実行しldap_get_entries

エントリを取得する効率

効率が対処され、エントリごとに多数の属性を持つ大きなデータベースでますます重要になる例。特に、jpegphotoという属性に画像を保存している場合は、選択した項目を選択したときの読み込み時間が大幅に短縮される可能性があります。

グループ「自転車所有者」にいるユーザーを探したいとします。これらのエントリには、cn、uid、name、displayname、mail、initials、mobile、telephonenumber、street、postaladdress、postalcode、jpegphotoという属性があります。今は自分のUID、名前、イニシャルだけが必要です。

このため、オプションのldap_searchの4番目のパラメータを使用します。

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com";
$filter = "uid=*"; //
$justhese = array("uid", "name", "initials");
$sr = ldap_search($ds, $dn, $filter, $justthese) or die ("bummer"); //define your search scope

ldap_get_entriesを実行すると、これらのデータだけが表示されます。

高度なフィルタリング

もちろん、LDAPを使用してデータベース全体を取得し、これをPHPでさらに処理することができます。しかし、MySQLの場合と同様に、サーバ側での処理はずっと効率的です。これを実証するために、我々は高度なフィルタを使用することができます。

上の例のいずれかを出発点として取るが、$ filterは以下の行にしたがって変更する。この例では、アクティブなユーザーのデータを表示します。通常、この情報を格納するにはshadowexpire属性が使用されます。ただし、これはさまざまなLDAPシステムによって異なる場合があります。アクティブなユーザーを表示するだけでなくその名前 "a"で始まり、アムステルダムに住んでいなければなりません。

基本的には3つのことをしたい:

  1. 最も簡単:アムステルダムに住んでいなければなりません。この例では、居住地は属性 'postaladdress'に格納されています。
$filter= "postaladdress=Amsterdam";
  1. 名前は "a"で始まらなければなりません。この例では、UIDは名前から構成されているため、次のようになります。
$filter= "uid=a*";
  1. ユーザーはアクティブでなければなりません。この値はデフォルト属性shadowexpire格納され、値は-1です。サーバーの構成によっては、 shadowexpire無数の値をshadowexpireできます。日付でも可能です。ユーザーが非アクティブの場合、 shadowexpire1ます。本当に非アクティブなユーザー以外のすべてのユーザーを確実に取得できるように、 shadowexpire = -1フィルタリングすることは選択しません。代わりに、私たちはそれらを非アクティブにしたくないと言います。
$filter= "(!(shadowexpire=1))"; //NOT is represented with "!"

今、最も興味深い部分:3つの例すべてを組み合わせる。角括弧、AND、OR、NOTの式でこれを行うことができます

$filter= "(&(postaladdress=Amsterdam)(uid=a*)(!(shadowexpire=1)))";

最後に、「|」を使用してOR文を作成することができます。たとえば、すべてのユーザーが「a」または「b」で始まる場合は、

$filter= "(|(uid=a*)(uid=n*))";

あなたは無限に結合し、かなり印象的なフィルタを構築し、試してみることができます!