LDAPクイックスタート

30838 ワード

LDAPクイックスタート
http://www.cnblogs.com/obpm/archive/2010/08/28/1811065.html
LDAPクイックスタート
1.LDAPの概要
LDAP(ライト級ディレクトリアクセスプロトコル、Lightweight Directory Access Protocol)は、ディレクトリサービスと呼ばれる情報サービスを提供することを実現するものである.ディレクトリ・サービスは、読み取り、閲覧、検索操作に特化した特殊なデータベース・システムです.ディレクトリは、一般的に、属性に基づく記述的な情報を含み、微細で複雑なフィルタリング能力をサポートするために使用されます.ディレクトリは、一般的に、汎用データベースが大量の更新操作に必要な複雑なトランザクション管理またはボリュームバックポリシーをサポートしません.ディレクトリサービスの更新は一般的に簡単です.このようなディレクトリは、個人情報、ウェブリンク、jpeg画像など、様々な情報を格納することができる.ディレクトリに格納された情報にアクセスするには、TCP/IP上で実行されるアクセスプロトコルであるLDAPを使用する必要があります.
 
LDAPディレクトリの情報は,ツリー型構造に従って組織され,具体的な情報はエントリ(entry)のデータ構造に格納される.エントリは、リレーショナル・データベース内のテーブルのレコードに相当します.エントリは、区別名DN(Distinguished Name)を持つ属性(Attribute)であり、DNはエントリを参照するために使用され、DNはリレーショナル・データベース・テーブルのキーワード(Primary Key)に相当する.属性はタイプ(Type)と1つ以上の値(Values)で構成され、リレーショナル・データベースのフィールド(Field)に相当するフィールド名とデータ型で構成されます.ただし、検索の必要性を容易にするために、LDAPのタイプは、リレーショナル・データベースでデータの冗長性要件を低減するために実装される各ドメインではなく、複数のValueを持つことができます.LDAPのエントリの組織は一般的に地理的位置と組織関係に従って組織され、非常に直感的である.LDAPはデータをファイルに格納し、効率を向上させるためにリレーショナル・データベースではなくインデックス・ベースのファイル・データベースを使用することができます.タイプの一例はmailであり、その値は電子メールアドレスになります.
 
LDAPの情報はツリー型構造で格納されており、ツリーのルートでは一般的に国(c=CN)またはドメイン名(dc=com)が定義され、その下では1つ以上の組織(organization)(o=Acme)または組織ユニット(organizational units)(ou=People)が定義されることが多い.1つの組織ユニットには、すべての従業員、ビル内のすべてのプリンタなどの情報が含まれる場合があります.また、LDAPは、オブジェクトカテゴリ(objectClass)と呼ばれる特殊な属性を持つエントリがサポートできるか、サポートしなければならない属性を制御することをサポートします.このプロパティの値は、エントリが少なくとも含めるべきプロパティを規定するルールを決定します.たとえば、inetorgPersonオブジェクトクラスはsn(surname)とcn(common name)のプロパティをサポートする必要がありますが、メール、電話番号などのオプションのプロパティも含まれます.
 
2.LDAP略称対応
o–organization(組織-会社)ou–organization unit(組織単位-部門)c-countryName(国)dc-domainComponent(ドメイン名)sn–suer name(実名)cn-common name(共通名) 
3.目次設計
ディレクトリ構造の設計はLDAPの最も重要な側面の一つである.次に、合理的なディレクトリ構造を設計する方法を簡単な例で説明します.この例はNetscapeアドレス帳を介して文書を訪問する.米国US(c=US)に位置し、複数の州にまたがるAcme(o=Acme)という会社があると仮定します.Acmeは、すべての従業員に小型のアドレス帳サーバを実現することを望んでいます.
 
簡単な組織DNから始めます
    dn: o=Acme, c=US
 
Acmeのすべての組織分類と属性は、サーバに格納されているディレクトリで一意であるDNの下に格納されます.Acmeは、従業員の情報を管理者(ou=Managers)と一般従業員(ou=Employees)の2つに分類したいと考えています.この分類によって生成される相対領域別名(RDN,relative distinguished names.頂点DNに対して)はshi:
 
    dn: ou=Managers, o=Acme, c=US
    dn: ou=Employees, o=Acme, c=US
 
以下に階層構造の構成を示します.頂点はUSのAcmeで、次は管理者組織ユニットと従業員組織ユニットです.従って、ManagersおよびEmployeesを含むDNは、以下のように構成される.
    dn: cn=Jason H. Smith, ou=Managers, o=Acme, c=US
    dn: cn=Ray D. Jones, ou=Employees, o=Acme, c=US
    dn: cn=Eric S. Woods, ou=Employees, o=Acme, c=US
 
LDAPは、Jason H.Smithの共通名(common name)エントリを参照するために、cn=Jason H.SmithのRDNを採用する.次に、前の親エントリを結合すると、次のツリー構造が形成されます.
 
    cn=Jason H. Smith
        + ou=Managers
            + o=Acme
                + c=US
                               -> dn: cn=Jason H. Smith,ou=Managers,o=Acme,c=US
 
 
ディレクトリ構造が定義され、次にディレクトリ情報データをインポートする必要があります.ディレクトリ情報データはLDIFファイルに格納され、ディレクトリ情報データをインポートするデフォルトの格納ファイルである.ユーザは、/etc/passwd、NISなどのシステムファイルからLDIFファイルを自動的に作成するためにPerlスクリプトを容易に作成することができる.
 
次の例では、ディレクトリ情報データをtestdateとして保存する.ldifファイル.manldifで入手できるフォーマットの説明です.
組織単位を追加する前に、まずAcme DNを定義する必要があります.
    dn: o=Acme, c=US
    objectClass: organization
 
ここでo属性は必須です
    o: Acme
 
以下は管理グループユニットのDNです.管理者情報を追加する前に、エントリを定義する必要があります.
    dn: ou=Managers, o=Acme, c=US
    objectClass: organizationalUnit
ここでou属性は必須です.
 
ou: Managers
最初のマネージャーDN:
    dn: cn=Jason H. Smith, ou=Managers, o=Acme, c=US
    objectClass: inetOrgPerson
cnとsnは必須のプロパティです.
    cn: Jason H. Smith
    sn: Smith
ただし、オプションのプロパティを定義することもできます.
    telephoneNumber: 111-222-9999
    mail: [email protected]
    localityName: Houston
 
別の組織単位を定義できます.
    dn: ou=Employees, o=Acme, c=US
    objectClass: organizationalUnit
    ou: Employees
 
従業員情報を次のように追加します.
    dn: cn=Ray D. Jones, ou=Employees, o=Acme, c=US
    objectClass: inetOrgPerson
    cn: Ray D. Jones
    sn: Jones
    telephoneNumber: 444-555-6767
    mail: [email protected]
    localityName: Houston
    dn: cn=Eric S. Woods, ou=Employees, o=Acme, c=US
    objectClass: inetOrgPerson
    cn: Eric S. Woods
    sn: Woods
    telephoneNumber: 444-555-6768
    mail: [email protected]
    localityName: Houston
 
 
4.OpenLDAPの構成
この文書では、Windowsの下にopenldapをインストールし、エントリを追加し、LdapBrowserブラウズ、Javaプログラムがopenldapに接続する全プロセスを実行します.
 
1.openldap for windowsのインストールをダウンロードし、現在のバージョン2.2.29のダウンロードアドレス:http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe
関連リンク:http://lucas.bergmans.us/hacks/openldap/
インストールは簡単です.nextでいいです.c:openldapにインストールするとします.
 
2.Openldapを構成し、sldpを編集する.confファイル
1)c:openldapsldpを開きます.conf、見つかりました
    include  C:/openldap/etc/schema/core.schema、その後に追加
    include  C:/openldap/etc/schema/cosine.schema
    include  C:/openldap/etc/schema/inetorgperson.schema
 
次の例は以上の3つのschemaしか使いません.もちろん、必要だと思ったら、他のschemaをすべて追加することができます.
    include  C:/openldap/etc/schema/corba.schema
    include  C:/openldap/etc/schema/dyngroup.schema
    include  C:/openldap/etc/schema/java.schema
    include  C:/openldap/etc/schema/misc.schema
    include  C:/openldap/etc/schema/nis.schema
    include  C:/openldap/etc/schema/openldap.schema
 
2)まだsldapです.confファイルで、
    suffix  "dc=my-domain,dc=com"
    rootdn  "cn=Manager,dc=my-domain,dc=com"
この2行を
    suffix "o=teemlink,c=cn" 
    rootdn "cn=Manager,o=teemlink,dc=cn"
 
suffixは自分がどのように定義したかを見て、後のステップのldifファイルを定義しなければなりません.また、このプロファイルにはrootpw secretがあります.このsecretはcn=Managerのパスワードです.後で使用しますが、ここでは明文パスワードです.コマンド:slappaswd-h{MD 5}-s secretで暗号化されたパスワード{MD 5}Xr 4 ilOzQ 4 PCOq 3 aQ 0 qbuaQ=を構成中のsecretに置き換えることができます.
 
3.Openldapの起動
CMDはc:openldapの下に入り、コマンドsldapd-d 1を実行します.
コンソールの下に表示される情報を印刷すると、openldapのデフォルトではBerkeley DBデータベースでディレクトリデータが格納されます.
 
4.エントリの作成、インポートldifファイルの編集
1)testなどのldif(LDAP Data Interchanged Format)ファイルを新規作成する.ldif、ファイルの内容は次のとおりです.
 
dn: o=teemlink
objectclass: top
objectclass: organization
o: develop
 
2)実行命令:ldapadd-l test.ldif
 
5.LDAP Browserによるアクセス
5.1 LDAP Browser 2をインストールする.6ソフトウェアでは、次の操作を行います.
     LDAP快速入门
   LDAP快速入门
 
5.2表示効果
   LDAP快速入门
 
5.JavaオペレーションLDAP
 
5.1 JNDIでのアクセス
package cn.myapps.test;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class LdapTest {
    public void JNDILookup() {
        String root = "o=teemlink,c=cn";
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://192.168.0.30/" + root);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "cn=Nicholas,ou=  ,o=teemlink,c=cn");
        env.put(Context.SECURITY_CREDENTIALS, "123456");
        DirContext ctx = null;

        try {
            ctx = new InitialDirContext(env);
            Attributes attrs = ctx.getAttributes("cn=Nicholas,ou=  ");
            System.out.println("Last Name: " + attrs.get("sn").get());
            System.out.println("    ");
        } catch (javax.naming.AuthenticationException e) {
            e.printStackTrace();
            System.out.println("    ");
        } catch (Exception e) {
            System.out.println("");
            e.printStackTrace();
        }
        if (ctx != null) {
            try {
                ctx.close();
            } catch (NamingException e) {
                // ignore
            }
        }
    }

    public static void main(String[] args) {
        LdapTest LDAPTest = new LdapTest();
        LDAPTest.JNDILookup();
    }
}


 
5.2 JLDAPによるアクセス
アクセスアドレス:http://www.openldap.org/jldap/関連libをダウンロード
 
import com.novell.ldap.*;

import java.io.UnsupportedEncodingException;

public class List

{

    public static void main(String[] args)

    {
        int ldapPort = LDAPConnection.DEFAULT_PORT;
        int searchScope = LDAPConnection.SCOPE_ONE;
        int ldapVersion = LDAPConnection.LDAP_V3;
        boolean attributeOnly = false;
        String attrs[] = null;
        String ldapHost = "192.168.0.30";
        String loginDN = "cn=Manager,o=teemlink,c=cn";
        String password = "secret";
        String searchBase = "ou=develop,o=teemlink,c=cn";
        String searchFilter = "objectClass=*";

        LDAPConnection lc = new LDAPConnection();
        try {
            // connect to the server
            lc.connect(ldapHost, ldapPort);

            // bind to the server
            lc.bind(ldapVersion, loginDN, password.getBytes("UTF8"));

            LDAPSearchResults searchResults =

            lc.search(searchBase, // container to search
                    searchScope, // search scope
                    searchFilter, // search filter
                    attrs, // "1.1" returns entry name only
                    attributeOnly); // no attributes are returned

            // print out all the objects
            while (searchResults.hasMore()) {
                LDAPEntry nextEntry = null;
                try {
                    nextEntry = searchResults.next();
                    System.out.println("
" + nextEntry.getDN()); System.out.println(nextEntry.getAttributeSet()); } catch (LDAPException e) { System.out.println("Error: " + e.toString()); // Exception is thrown, go for next entry continue; } } // disconnect with the server lc.disconnect(); } catch (LDAPException e) { System.out.println("Error: " + e.toString()); } catch (UnsupportedEncodingException e) { System.out.println("Error: " + e.toString()); } System.exit(0); } }


 
5.3 JDBC-LDAPによるアクセス
アクセスアドレス:http://www.openldap.org/jdbcldap/関連libをダウンロード
 
package jdbcldap;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcLdap {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        Class.forName("com.octetstring.jdbcLdap.sql.JdbcLdapDriver");
        String ldapConnectString = "jdbc:ldap://192.168.0.30/o=teemlink,c=cn?SEARCH_SCOPE:=subTreeScope";
        Connection con = DriverManager.getConnection(ldapConnectString, "cn=Manager,o=teemlink,c=cn", "secret");

        String sql = "SELECT * FROM ou=develop,o=teemlink,c=cn";

        Statement sat = con.createStatement();
        ResultSet rs = sta.executeQuery(sql);
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }

        if (con != null)
            con.close();
    }
}