Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

LDAPとJNDIでシングルサインオン可能なWebを作る

JavaからLDAPを操作する方法

  • LINEで送る
  • このエントリーをはてなブックマークに追加

ディレクトリサーバーのエントリデータを操作(CRUD:新規登録・抽出・更新・削除)する簡単なWebアプリケーションにより、JavaからLDAPを操作する方法を紹介します。

目次

はじめに

 企業内などで複数のシステムが開発されると、ユーザーはシステムごとにユーザーID・パスワードを使い分けるなどの不便さを強いられることがしばしばあります。このようなわずらわしさを解消するために、シングルサインオンという仕組みへの取り組みが企業などではじまっています。シングルサインオンとは、ユーザが一度認証を受けるだけで、許可されているすべての機能を利用できるようになるシステムのことをいいます。このシングルサインオンにより、安全な認証機能の実現、システム管理者やアプリケーション開発者の負担軽減などの効果も期待できます。

 シングルサインオンを実現する際は、ユーザー認証情報を「ディレクトリサービス」という仕組みで統合的に管理するという手法が一般的に採用されます。「ディレクトリサービス」とは、ユーザー情報などのネットワーク上の資源と、その属性とを保存し、検索できるようにしたシステムのことです。このディレクトリサービスにアクセスするためのプロトコルとして最も使用されるのがLDAP(Lightweight Directory Access Protcol)です。

 シングルサインオンが普及していく中で、エンジニアもJavaからディレクトリサービスにアクセスし、データを操作するプログラムを開発する機会が増えてくると思われます。本稿では、そのようなエンジニアの最初の一歩として参考となる簡単なWebアプリケーションを紹介します。

対象読者

 Javaでプログラミングしたことがある方を対象とします。

必要な環境

 本稿ではLDAPサーバーとして、OpenLDAP(バージョン2.2.13)を使用します。OpenLDAPのインストール方法については、参考資料などを参照してください。

著注
 LDAPはプロトコルの名前ですが、OpenLDAPなどのLDAPを実装したディレクトリサービスのためのソフトウェアもLDAPと呼ぶことがあります。本稿で使用するディレクトリサービスも「LDAPサーバー」と呼ぶ事にします。

JNDI(Java Naming and Directory Interface)

 Javaでは、ディレクトリサービスへアクセスするためのAPIとして、標準でJNDI(Java Naming and Directory Interface)が用意されています。JNDIは、ネーミングサービスやディレクトリサービスにアクセスするための汎用的なAPIです。ネーミングサービスとは、文字列で表現される名前と特定のオブジェクトとを関連づけ、名前を指定することにより対応するオブジェクトを取得することができるサービスのことです。ディレクトリサービスは上記で述べたとおりです。

LDAPについて

 サンプルアプリケーションについて説明する前に、LDAPについての基本的な事項について簡単に説明します。

LDAPの概念

 以下の図にLDAPの概念を示します。LDAPは、DIT(Direcotry Information Tree:ディレクトリ情報ツリー)という階層ツリー内に、エントリーが配置されるという構造になっています。

DIT(Direcotry Information Tree:ディレクトリ情報ツリー)
DIT(Direcotry Information Tree:ディレクトリ情報ツリー)
 LDAPの階層構造の表現は、example.comというドメインの場合「dc=example,dc=com」 のようにルートから近い方が右側に表記されます。

 上記の図に登場した用語を以下の表にまとめます。

LDAPの用語
用語説明
エントリ実世界にあるオブジェクトをコンピュータ上のLDAPの中に対応づけしたもの。ディレクトリサービスの階層ツリー(DIT)上に配置される。
DITエントリの階層関係をツリーで表したもの。Directory Information Tree(ディレクトリ情報ツリー)の略。
DNディレクトリ情報ツリー上で、エントリを一意に識別するための名前のこと。LDAPでは「属性名=属性値,属性名=属性値・・」の書式であらわした文字列。文字列の右から、ツリーのルートに近い属性となる。
ルートサフィックスDITの最上位のエントリにつける名前。上記の図では「dc=example,dc=com」

 またDIT上に配置されるエントリは下図のように複数の属性をもち、その属性は複数の値を持つことができます。

 最後に、以下の表にLDAPで標準的に使用される代表的な属性型を列挙します。

代表的な属性型
属性名説明
dcドメイン名の一部など(Domain Componentの略)
ou組織の部署など(Organization Unitの略)
cn一般名(Common Nameの略)。様々なオブジェクトの名前を表すために汎用的に使用される。
sn名字(Surname)
c国の名前(Country。DNSで使われる2文字の国名などを使う)
o組織の名前など(Organization)
l地域の名前(Locality)
st州、都道府県名など(State)

LDAPの操作モデル

 以下の表に、LDAPクライアントがLDAPサーバーに対して発行できる操作を示します。本稿のサンプルでは、バインド、検索、追加、更新、削除、アンバインドを使用します。

LDAPの操作モデル
操作内容
バインドLDAPセッションの開始
比較特定のエントリ中の属性値の比較
検索検索条件(フィルター)に一致するエントリを検索
追加新規エントリの追加
更新特定のエントリの属性値の追加、更新、削除
削除特定のエントリの削除
改名特定のエントリのDN(識別名)の変更
放棄要求中のLDAP操作の放棄
アンバインドLDAPセッションの終了

サンプルアプリケーション概要

機能概要/画面遷移

 ディレクトリサーバーで管理されている社員データを、JavaのWebアプリケーションから新規登録・検索・更新・削除(CRUD)するWebアプリケーションです。なおサンプルでは、StrutsなどのWebアプリケーションフレームワークは使用していません。画面遷移を下図に示します。

サンプルのデータ構造

 本稿のサンプルでは、「example.com」ドメインの「Users」グループに属する社員をデータ操作の対象とします。以下の図にLDAPブラウザで、サンプルのディレクトリーツリーを参照した画面を示します。下図のLDAPブラウザは、LDAP Browser/Editorを使用しています。インストール方法・使用方法は、参考資料などを参照してください。

 図中の「dc=example,dc=com」は、example.comをLDAPのDN形式で表した文字列です。またツリー上では、example.comの下にUsersという組織(ou:Organization Unit)が所属しています。そのUsersの中に、社員ID(cn:Common Name)が00001と00002の社員が所属しています。

サーバー・データの準備

 サンプルアプリケーションを動作させるために、LDAPサーバー上にデータを準備します。

サフィックス・管理者・管理者パスワードの設定

 「/etc/openldap/slapd.conf」ファイルにLDAPサーバーの基本設定を記述します。

/etc/openldap/slapd.conf
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          secret

 以下の表に「slapd.conf」に設定したディレクティブをまとめます。

「slapd.conf」の設定
ディレクティブ説明
suffixdc=example,dc=comルートサフィックス
rootdncn=Manager,dc=example,dc=com管理者のDN(Distinguished Name:識別名)
rootpwsecret管理者のパスワード
 通常運用ではrootpwディレクティブの平文での指定は推奨されません。通常はハッシュ化した値を設定します。ハッシュ化された値を取得するには、openldap付属のslappasswdコマンドを使用しますが、詳細は参考資料などを参照してください。

階層ツリーの作成

 社員データを格納するためのDIT(ディレクトリ情報ツリー)を作成します。階層構造は、ルートから近い順にcom-example-Usersとなります。

  1. LDIFファイルの作成
  2. LDAPのデータをまとめて入出力する際は、LDIF(LDAP Data Interchange Format)というテキスト形式のファイルを使用するのが便利です。本稿でもLDIFファイルを使用してデータを作成します。以下が、サンプルの階層ツリーを作成するためのLDIFファイルです。LDIFのフォーマットなどについての詳細は参考資料などを参照してください。
    sample.ldif
    dn: dc=example,dc=com
    objectClass: dcObject
    objectClass: organization
    o: example
    dc: example
    
    dn: ou=Users,dc=example,dc=com
    objectClass: top
    objectClass: organizationalUnit
    ou: Users
    
  3. LDIFによるデータの投入
  4. OpenLDAP付属のldapaddコマンドで、1.で作成した「sample.ldif」ファイルを入力としてLDAPサーバー上に階層ツリーを作成します。ldapaddコマンドについての詳細は、ldapaddコマンドのヘルプか参考資料などを参照してください。
    ldapadd -x -h localhost -D cn=manager,dc=example,
    dc=com -f sample.ldif  -W
    

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5