SlideShare a Scribd company logo
1 of 49
Download to read offline
Ruby で扱う LDAP のススメ
  - Ruby meets LDAP -
      その選択肢と事例
    - Choices and cases –

    高瀬一彰 / @tasheeen
Who?
高瀬一彰 (Kazuaki Takase)
エイケア・システムズ株式会社
Lang: perl→php→ruby+javascript
Rails で LDAP 管理アプリ
Why?
Ruby with LDAP に関する情報の不足
LDAP 自体がマイナー
Ruby コミュニティに、LDAPを扱うため
の入り口となる情報を提供したい
 LDAPって?
 どんなライブラリがあるの?
 どれを使えばいいの?
What?
LDAP の概略
LDAP ライブラリの紹介
事例紹介
コード例
参考資料一覧
LDAPの概略
LDAPの概略(1)
Keywords
  LDAP
  Entry
  ObjectClass
  Attribute
  DIT
  Distinguished Name
LDAPの概略(2)
Lightweight Directory Access Protocol
  RFC4510などで定義
  元々は DAP。その軽量版(=Lightweight)
  Directory = 台帳・名簿
  何でも登録可能
  台帳として最適化したデータ構造を持つ
LDAPの概略(3)
Entry
 LDAPにおけるデータの基本単位
   =台帳の登録単位。名簿なら「人」
   ≒RDBにおける行に近い
 現実世界の「物(=オブジェクト)」を表す
 エントリは属性を持つ
   「人」に対する「名前」「電話番号」etc.
 RDB と違う点
   エントリがスキーマを持つ
LDAPの概略(4)
Object Class
 エントリが「何」か
   OOP の「クラス」と同義
 オブジェクトクラスに
 よって持てる属性が変わる
 Unix アカウントのエント
 リなら posixAccount
 継承・抽象型・構造型・補
 助型などの概念とルール
 posixAccountは補助型
   person 等と組み合わせる
LDAPの概略(5)
Attributes
  一つの属性に複数の値
  を持っている場合が多
  い
  台帳・名簿としての
  考え方
LDAPの概略(6)
Directory Information Tree (DIT)
  ディレクトリデータベースを DIB
  ツリー構造していると DIT
  階層的に管理するのがコンセプト
  エントリがツリーとして連なる
LDAPの概略(7)
Distinguished Name(DN)
  Rlative Distinguished
  Name(RDN)
    その階層における一意の
    名前
      cn=Ruby Taro
    エントリが持つ任意の属
    性がRDNになる
 RDNを下から一番上まで
                          cn=Ruby Taro,o=RubyKaigi2010,c=jp
 繋げるとツリーで一意に
 特定される名前になる
 (DN)
Ruby with LDAP
Ruby with LDAP - libs



Obsolete !




Obsolete !
Ruby with LDAP - libs



               RFC 1823の実装             Pure Ruby.             ActiveRecordのLDAP版
 character     拡張ライブラリ                                        Rails と相性がいい
                                                              抽象度が高い

                                       ruby-ldap より10倍程       net-ldap よりも3倍程度
weak point     ドキュメントが少ない
                                       度遅い                    遅い


advantage      速い!                     ポータビリティが高い             高度な抽象化と豊富な機能



     install   gem install ruby-ldap   gem install net-ldap   gen install activeldap



    for use    require “rubygems”      require “rubygems”     require “rubygems”
               require “ldap”          require “net-ldap”     require “active_ldap”
Ruby with LDAP – ruby-ldap
ruby-ldap
 RFC1823 (The LDAP Application Programming Interface)
 のRuby版実装
 使い方は同梱のテストが参考になる
 速い!
   bind

  search

    add

  modify
                   C Extension
   etc…
Ruby with LDAP – net-ldap
net-ldap
 Pure Ruby な LDAP API 実装
 ポータビリティに富む
 RDoc のドキュメントが結構しっかりしている
   bind

  search

   add

  modify
           Pure Ruby

  etc…
Ruby with LDAP - activeldap
activeldap
 ActiveRecord を参考に作られた、LDAP API
 ruby-ldap や net-ldap, JNDI を内部的に利用
 クラスはツリーを抽象、インスタンスはエントリを抽象

          ActiveLdap::Base

 find         User
 new       (Subclass)

 cn=

 save

destroy
Cases
Case 1
   事例提供者:カピバラさん
http://sites.google.com/site/capibaraproject/home
Case カピバラさん
背景
社内の各システム毎にID情報が分散
既存のLDAPサーバがあった
 既存の構造的には認証統一には難しかった
新規にLDAP作成
管理アプリ作成
 管理
     ユーザ一覧/検索/新規作成/所属変更
     パスワード初期化 等
 ユーザ
     パスワード変更
Case カピバラさん




パスワード初期化

ユーザ管理         パスワード変更
 一覧
 検索
 新規作成
 所属変更
Case カピバラさん
ruby-ldap
 ActiveLdap は使いづらかったそうで回避(泣
   確かに ruby-ldap の方がプリミティブな実装
 ruby-ldapに限らず、LDAPについても情報が
 不足して困った
 速度面・利便性について特に不満なし
Case 2
事例提供者:岡澤さん
http://d.hatena.ne.jp/yujiorama/
Case 岡澤さん
ruby-ldap を利用
分散した社員マスタ/認証を統合




アカウント
 作成・編集・削除                  パスワード変更など
ML
 依頼があり次第        管理作業   参照できる
 作成・変更



      request
Case 岡澤さん
ruby-ldap
 元々作った人が「Rails 関連は面倒」(笑
 openldap のコマンドとほぼ同じような作り
 で、コマンドの使い方が判ると直観的に使え
 た
 同様の理由で、デバッグ等もやりやすかった
Case 3
事例提供者:谷口さん
Case 4
事例提供者:高瀬
Case 高瀬
activeldap
アカウント/権限管理




            sync
                                     batch
 ユーザ管理                      batch
                                     (Create folder
   有効化/編集/権限付与     (script/runner)    & ACL settings)
   退職処理
   パスワード初期化など        Password
 共有フォルダ管理            Warning(mail)
 サブシステム権限管理                          共有フォルダ
 etc                                  作成
                                      権限編集
                                     サブシステム権限編集
        request                      パスワード変更
Case 高瀬
activeldap
 Rails の機能を活用したかった
 script/runner でライブラリ使えるの便利
 validation や association 使えるの便利
   validationは作りによってはとっても遅くなる
      uid の uinique チェックのため検索するなどのvalidation
      を多数含めたりすると
      検索時に取得する属性の数を少なくして速くする等の工夫
      をすると吉
 テストも Rails に統合
   VM でdevelopment, test 用の LDAP を作成
   環境(development, test)によって接続先 LDAP 切替
   Rspec でふつうにテスト
Code Examples
Code Examples – ruby-ldap (1)
Connection and Bind
  LDAP::Conn.new / LDAP::Conn#bind
  @conn = LDAP::Conn.new('localhost', 389)
  @conn.bind("cn=Manager,o=RubyKaigi2010,c=jp", pass)
    # => #<LDAP::Conn:0xb7f0d400>

    LDAP::Conn.new で接続
       SSL接続には LDAP::SSLCon.new を利用
    LDAP::Conn#bind でバインドする
       第三引数の定数で認証方式の指定
          Default: LDAP_AUTH_SIMPLE
          grep LDAP_AUTH ldap.c
       SSL 接続には LDAP::SSLConn
Code Examples – ruby-ldap (2)
search
  LDAP::Conn#search
  @conn.search("o=RubyKaigi2010,c=jp", LDAP::LDAP_SCOPE_SUBTREE,
                "(objectclass=*)") do |entry|
                  entry # => #<LDAP::Entry:…>, #<LDAP::Entry:…>, …
                end
     検索結果を LDAP ::Entry で返す
     ブロック必須
     他にも結果を Hash で返す search2 がある
         Search2 はブロック無しで検索可能
Code Examples – ruby-ldap (3)
Add
 LDAP::Conn#add
  entry = {"objectclass" => ["top", "person"],
            "cn" => ["Ruby Taro"],
            "sn" => ["Ruby", "Taro"]}

  # 追加先のDN を指定し、属性の内容を渡す
  @conn.add("cn=#{entry['cn'][0]},o=RubyKaigi2010,c=jp", entry)
    # => #<LDAP::Conn:0xXXXXXXXX>


      HashやLDAP::MOD_ADD でエントリ追加
      上記の例は Hash の場合
Code Examples – ruby-ldap (4)
Modify
  LDAP::Conn#modify
  mod_hash = {"sn" => ["hoge", "taro"]}

  @conn.modify("cn=Ruby Taro,o=RubyKaigi2010,c=jp", mod_hash) # =>
  #<LDAP::Conn:0xb7f0bbc8>

     HashやLDAP::MOD_MOD でエントリ更新
     上記の例は Hash の場合
Code Examples – ruby-ldap (5)
Gathering Error Information
  LDAP::Error
  begin
    @conn.delete("cn=Ruby Taro,o=RubyKaigi2010,c=jp")
  rescue => e
    e     # => #<LDAP::ResultError: No such object>
    e.message                    # => "No such object“

    @conn.err                     # => 32
    @conn.err2string(@conn.err)   # => "No such object"
  end
     原則として LDAP::Error が投げられる様子
     Human Readable なメッセージは LDAP::Error 自身が持っている
     エラーコードが欲しい場合に #<LDAP::Conn> に問い合わせる
Code Examples – net-ldap(1)
Connection and BIND
 Net::LDAP.new
  @ldap = Net::LDAP.new :host => 'localhost',
                        :port => 389,
                        :base => 'o=RubyKaigi2010,c=jp',
                        :auth => {
                         :method => :simple,
                         :username => 'cn=Manager,o=RubyKaigi2010,c=jp',
                         :password => password }
  @ldap # => #<Net::LDAP:0xb7e086f4 @base="o=RubyKaigi2010,c=jp",…>


     接続と bind を一緒に行うのが通例
Code Examples – net-ldap(2)
search
  Net::LDAP#search
  @ldap.search # => [#<Net::LDAP::Entry: ...>, #<Net::LDAP::Entry ...>]

  @ldap.search(:filter => Net::LDAP::Filter.eq('uid', 'matz')) # =>
  [#<Net::LDAP::Entry: … :uid=>["matz"], …>]


     デフォルトでは “(objectClass=*)” で検索
     フィルタを利用する場合は Net::LDAP::Filter を利用して
     フィルタを構成する
     ブロックを渡してイテレーションさせることも可
Code Examples – net-ldap(3)
Add
 Net::LDAP#add
 attrs = {
   :objectclass => ["top", "inetOrgPerson", "posixAccount"],
   :cn => "ruby taro",
   :gidNumber => "1999",
   :homeDirectory => "/home/ruby_taro",
   :sn => ["ruby", "taro"],
   :uid => "ruby_taro",
   :uidNumber => "1999"
 }
 dn = "uid=#{attrs[:uid]},ou=Users,o=RubyKaigi2010,c=jp"

 @ldap.add(:dn => dn, :attributes => attrs) # => false
 @ldap.get_operation_result # => #<OpenStruct … "Success",…, code=0>

      ※何故か false を返してますが成功しています
      (僕の環境のせい?)
Code Examples – net-ldap(4)
Modify
  Net::LDAP#modify
  dn = "uid=ruby_taro,ou=Users,o=RubyKaigi2010,c=jp"

  opts = [
    [:add, :mail, "hoge@example.com"],
    [:replace, :sn, ["hoge", "fuga"]],
    [:delete, :telephoneNumber]
  ]

  @ldap.modify(:dn => dn, :operations => opts) # => false

     ※これも何故か false を返してますが成功しています
     (僕の環境のry)
Code Examples – net-ldap(5)
Gathering Error Information
  Net::LDAP#get_operation_result
  @ldap.add(:dn => dn, :attr => attr) # => false

  @ldap.get_operation_result.code            #   =>   2
  @ldap.get_operation_result.message         #   =>   "Protocol Error"
  @ldap.get_operation_result.error_message   #   =>   "no attributes provided"
  @ldap.get_operation_result.matched_dn      #   =>   ""
  @ldap.get_operation_result                 #   =>   #<OpenStruct …>


     OpenStruct でエラー情報を返す
     上記は objectClass の MUST の属性を設定していない場合の例
Code Examples – activeldap(1)
Connection and Bind
  ActiveLdap::Base.setup_connection
  ActiveLdap::Base.setup_connection :base => "o=RubyKaigi2010,c=jp",
                      :bind_dn => "cn=Manager,o=RubyKaigi2010,c=jp",
                      :password_block => lambda{pass},
                      :logger => logger

     この時点では接続が確立されず、何か操作した時に接続
     サブクラス毎に接続先を変えること等も可能
Code Examples – activeldap(2)
Mapping
 define subclass
 class User < ActiveLdap::Base
   ldap_mapping :prefix => "ou=Users",
                 :classes => %w(person),
                 :scope => :sub,
                 :dn_attribute => "uid"
 end
    クラスを任意のツリーにマッピング
    このクラスを利用して指定したツリー以下の検索等を行う
    インスタンスを作成するとエントリにマッピングされる
    belongs_to, has_many 等も利用できる
    全体的に ActiveRecord と類似したインターフェース
Code Examples – activeldap(3)
Search
 ActiveLdap::Base.find
  User.find(:all) # => [#<User ...>, #<User ...>, ...]
  User.find(:first, :filter => “(cn=Ruby Taro)”) #=> #<User ...>

     ActiveRecord と同様の検索方法
     検索条件は :filter オプション
     エントリとマッピング済みのインスタンスを返す
Code Examples – activeldap(4)
Add/Modify
 ActiveLdap::Base#save , save!
  user = User.new :sn => 'Ruby', :cn => "Ruby Taro"
  user.save # => true

  user.sn = “Hoge”
  user.save # => true
     インスタンスの状態に合わせて add/modify
     新規オブジェクトなら add
     既存オブジェクトなら modify
     属性に複数の値を入れたい場合は配列で
Code Examples – activeldap(5)
Gathering Error Information
  ActiveRecord::Validations#errors
  user = User.new :sn => 'Ruby', :cn => "Ruby Taro"
  user.save # => false

  user.errors # => #<ActiveRecord::Errors ...>
  user.errors.full_messages
   # => ["distinguishedName is duplicated: cn=Ruby Taro,ou=Users,o=RubyKaigi2010,c=jp"]



      errors メソッドが ActiveRecord::Errors を返す
      Rails で Webインターフェース等作る際は比較的楽
参考資料
参考資料
LDAP         RFC 4510
             http://datatracker.ietf.org/doc/rfc4510/

             Rubyist Magazine - ActiveLdap を使ってみよう(前編)- LDAPとは
             http://jp.rubyist.net/magazine/?0027-ActiveLdap#l4

ruby-ldap    Ruby/LDAP (Homepage)
             http://ruby-ldap.sourceforge.net/

             RDoc
             http://ruby-ldap.sourceforge.net/rdoc/

             ソースコード。特に test ディレクトリ以下

net-ldap     Net-ldap-0.1.1 Documentation (Homepage)
             http://net-ldap.rubyforge.org/

activeldap   ActiveLdap を使ってみよう(前編)
             http://jp.rubyist.net/magazine/?0027-ActiveLdap

             ActiveLdap を使ってみよう(後編)
             http://jp.rubyist.net/magazine/?0029-ActiveLdap

             Rails で作る ActiveDirectory と連携した社内システム
             http://www.clear-code.com/archives/rails-seminar-technical-night/

             ActiveLdap 日本語チュートリアル
             http://code.google.com/p/ruby-activeldap/wiki/TutorialJa
ありがとうございました
   Thank you.

More Related Content

What's hot

Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...joisino
 
「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!
「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!
「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!Yoshiki Hayama
 
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016Yusuke Suzuki
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニア新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニアakira6592
 
サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践TakefumiYoshii
 
勝てる「開発プロセス」のつくり方
勝てる「開発プロセス」のつくり方勝てる「開発プロセス」のつくり方
勝てる「開発プロセス」のつくり方Hiromasa Oka
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
楽天におけるビッグデータとその活用について
楽天におけるビッグデータとその活用について楽天におけるビッグデータとその活用について
楽天におけるビッグデータとその活用についてRakuten Group, Inc.
 
カンバンゲーム
カンバンゲームカンバンゲーム
カンバンゲームYasui Tsutomu
 
Redmineって何ができるの?
Redmineって何ができるの?Redmineって何ができるの?
Redmineって何ができるの?Tomohisa Kusukawa
 
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメントDX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメントTakeshi Kakeda
 
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜Takeshi Arabiki
 
誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜
誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜
誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜Yoshiki Hayama
 
はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018
はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018
はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018Yoshiki Hayama
 

What's hot (20)

Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
 
「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!
「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!
「ユーザーを理解するって言うほどカンタンじゃないよね」 UXデザイン・UXリサーチをもう一度ちゃんと理解しよう!
 
Idea21
Idea21Idea21
Idea21
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニア新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニア
 
サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践
 
勝てる「開発プロセス」のつくり方
勝てる「開発プロセス」のつくり方勝てる「開発プロセス」のつくり方
勝てる「開発プロセス」のつくり方
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
xrdpで変える!社内のPC環境
xrdpで変える!社内のPC環境xrdpで変える!社内のPC環境
xrdpで変える!社内のPC環境
 
楽天におけるビッグデータとその活用について
楽天におけるビッグデータとその活用について楽天におけるビッグデータとその活用について
楽天におけるビッグデータとその活用について
 
カンバンゲーム
カンバンゲームカンバンゲーム
カンバンゲーム
 
Marp入門
Marp入門Marp入門
Marp入門
 
Redmineって何ができるの?
Redmineって何ができるの?Redmineって何ができるの?
Redmineって何ができるの?
 
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメントDX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
 
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
 
誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜
誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜
誰も教えてくれないペルソナのひみつ 〜ペルソナの上手な使いかた〜
 
はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018
はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018
はじめてのUXデザイン、はじめてのデザイン思考 〜現場で使えるように〜:ISE Technical Conference 2018
 

Similar to Ruby で扱う LDAP のススメ

Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
Web技術勉強会 第25回
Web技術勉強会 第25回Web技術勉強会 第25回
Web技術勉強会 第25回龍一 田中
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller FundamentalsTakashi SAKAGUCHI
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
これからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようこれからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようNobuyuki Sasaki
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogrammingMasanori Kado
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
マルチテナント Hadoop クラスタのためのモニタリング Best Practiceマルチテナント Hadoop クラスタのためのモニタリング Best Practice
マルチテナント Hadoop クラスタのためのモニタリング Best PracticeHadoop / Spark Conference Japan
 
Ruby Extended Library
Ruby Extended LibraryRuby Extended Library
Ruby Extended LibraryAkio Tajima
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)Masanori Machii
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osakaNaotaka Jay HOTTA
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介Kevin Toyoda
 
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3日本Javaユーザーグループ
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_luaRyosuke MATSUMOTO
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料Recruit Technologies
 

Similar to Ruby で扱う LDAP のススメ (20)

Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Web技術勉強会 第25回
Web技術勉強会 第25回Web技術勉強会 第25回
Web技術勉強会 第25回
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller Fundamentals
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
これからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようこれからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみよう
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
OSC2012 OSC.DB Hadoop
OSC2012 OSC.DB HadoopOSC2012 OSC.DB Hadoop
OSC2012 OSC.DB Hadoop
 
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
マルチテナント Hadoop クラスタのためのモニタリング Best Practiceマルチテナント Hadoop クラスタのためのモニタリング Best Practice
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
 
Ruby Extended Library
Ruby Extended LibraryRuby Extended Library
Ruby Extended Library
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
 
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料
 

Recently uploaded

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Recently uploaded (8)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

Ruby で扱う LDAP のススメ

  • 1. Ruby で扱う LDAP のススメ - Ruby meets LDAP - その選択肢と事例 - Choices and cases – 高瀬一彰 / @tasheeen
  • 2. Who? 高瀬一彰 (Kazuaki Takase) エイケア・システムズ株式会社 Lang: perl→php→ruby+javascript Rails で LDAP 管理アプリ
  • 3. Why? Ruby with LDAP に関する情報の不足 LDAP 自体がマイナー Ruby コミュニティに、LDAPを扱うため の入り口となる情報を提供したい LDAPって? どんなライブラリがあるの? どれを使えばいいの?
  • 6. LDAPの概略(1) Keywords LDAP Entry ObjectClass Attribute DIT Distinguished Name
  • 7. LDAPの概略(2) Lightweight Directory Access Protocol RFC4510などで定義 元々は DAP。その軽量版(=Lightweight) Directory = 台帳・名簿 何でも登録可能 台帳として最適化したデータ構造を持つ
  • 8. LDAPの概略(3) Entry LDAPにおけるデータの基本単位 =台帳の登録単位。名簿なら「人」 ≒RDBにおける行に近い 現実世界の「物(=オブジェクト)」を表す エントリは属性を持つ 「人」に対する「名前」「電話番号」etc. RDB と違う点 エントリがスキーマを持つ
  • 9. LDAPの概略(4) Object Class エントリが「何」か OOP の「クラス」と同義 オブジェクトクラスに よって持てる属性が変わる Unix アカウントのエント リなら posixAccount 継承・抽象型・構造型・補 助型などの概念とルール posixAccountは補助型 person 等と組み合わせる
  • 10. LDAPの概略(5) Attributes 一つの属性に複数の値 を持っている場合が多 い 台帳・名簿としての 考え方
  • 11. LDAPの概略(6) Directory Information Tree (DIT) ディレクトリデータベースを DIB ツリー構造していると DIT 階層的に管理するのがコンセプト エントリがツリーとして連なる
  • 12. LDAPの概略(7) Distinguished Name(DN) Rlative Distinguished Name(RDN) その階層における一意の 名前 cn=Ruby Taro エントリが持つ任意の属 性がRDNになる RDNを下から一番上まで cn=Ruby Taro,o=RubyKaigi2010,c=jp 繋げるとツリーで一意に 特定される名前になる (DN)
  • 14. Ruby with LDAP - libs Obsolete ! Obsolete !
  • 15. Ruby with LDAP - libs RFC 1823の実装 Pure Ruby. ActiveRecordのLDAP版 character 拡張ライブラリ Rails と相性がいい 抽象度が高い ruby-ldap より10倍程 net-ldap よりも3倍程度 weak point ドキュメントが少ない 度遅い 遅い advantage 速い! ポータビリティが高い 高度な抽象化と豊富な機能 install gem install ruby-ldap gem install net-ldap gen install activeldap for use require “rubygems” require “rubygems” require “rubygems” require “ldap” require “net-ldap” require “active_ldap”
  • 16. Ruby with LDAP – ruby-ldap ruby-ldap RFC1823 (The LDAP Application Programming Interface) のRuby版実装 使い方は同梱のテストが参考になる 速い! bind search add modify C Extension etc…
  • 17. Ruby with LDAP – net-ldap net-ldap Pure Ruby な LDAP API 実装 ポータビリティに富む RDoc のドキュメントが結構しっかりしている bind search add modify Pure Ruby etc…
  • 18. Ruby with LDAP - activeldap activeldap ActiveRecord を参考に作られた、LDAP API ruby-ldap や net-ldap, JNDI を内部的に利用 クラスはツリーを抽象、インスタンスはエントリを抽象 ActiveLdap::Base find User new (Subclass) cn= save destroy
  • 19. Cases
  • 20. Case 1 事例提供者:カピバラさん http://sites.google.com/site/capibaraproject/home
  • 22. Case カピバラさん パスワード初期化 ユーザ管理 パスワード変更 一覧 検索 新規作成 所属変更
  • 23. Case カピバラさん ruby-ldap ActiveLdap は使いづらかったそうで回避(泣 確かに ruby-ldap の方がプリミティブな実装 ruby-ldapに限らず、LDAPについても情報が 不足して困った 速度面・利便性について特に不満なし
  • 25. Case 岡澤さん ruby-ldap を利用 分散した社員マスタ/認証を統合 アカウント 作成・編集・削除 パスワード変更など ML 依頼があり次第 管理作業 参照できる 作成・変更 request
  • 26. Case 岡澤さん ruby-ldap 元々作った人が「Rails 関連は面倒」(笑 openldap のコマンドとほぼ同じような作り で、コマンドの使い方が判ると直観的に使え た 同様の理由で、デバッグ等もやりやすかった
  • 29. Case 高瀬 activeldap アカウント/権限管理 sync batch ユーザ管理 batch (Create folder 有効化/編集/権限付与 (script/runner) & ACL settings) 退職処理 パスワード初期化など Password 共有フォルダ管理 Warning(mail) サブシステム権限管理 共有フォルダ etc 作成 権限編集 サブシステム権限編集 request パスワード変更
  • 30. Case 高瀬 activeldap Rails の機能を活用したかった script/runner でライブラリ使えるの便利 validation や association 使えるの便利 validationは作りによってはとっても遅くなる uid の uinique チェックのため検索するなどのvalidation を多数含めたりすると 検索時に取得する属性の数を少なくして速くする等の工夫 をすると吉 テストも Rails に統合 VM でdevelopment, test 用の LDAP を作成 環境(development, test)によって接続先 LDAP 切替 Rspec でふつうにテスト
  • 32. Code Examples – ruby-ldap (1) Connection and Bind LDAP::Conn.new / LDAP::Conn#bind @conn = LDAP::Conn.new('localhost', 389) @conn.bind("cn=Manager,o=RubyKaigi2010,c=jp", pass) # => #<LDAP::Conn:0xb7f0d400> LDAP::Conn.new で接続 SSL接続には LDAP::SSLCon.new を利用 LDAP::Conn#bind でバインドする 第三引数の定数で認証方式の指定 Default: LDAP_AUTH_SIMPLE grep LDAP_AUTH ldap.c SSL 接続には LDAP::SSLConn
  • 33. Code Examples – ruby-ldap (2) search LDAP::Conn#search @conn.search("o=RubyKaigi2010,c=jp", LDAP::LDAP_SCOPE_SUBTREE, "(objectclass=*)") do |entry| entry # => #<LDAP::Entry:…>, #<LDAP::Entry:…>, … end 検索結果を LDAP ::Entry で返す ブロック必須 他にも結果を Hash で返す search2 がある Search2 はブロック無しで検索可能
  • 34. Code Examples – ruby-ldap (3) Add LDAP::Conn#add entry = {"objectclass" => ["top", "person"], "cn" => ["Ruby Taro"], "sn" => ["Ruby", "Taro"]} # 追加先のDN を指定し、属性の内容を渡す @conn.add("cn=#{entry['cn'][0]},o=RubyKaigi2010,c=jp", entry) # => #<LDAP::Conn:0xXXXXXXXX> HashやLDAP::MOD_ADD でエントリ追加 上記の例は Hash の場合
  • 35. Code Examples – ruby-ldap (4) Modify LDAP::Conn#modify mod_hash = {"sn" => ["hoge", "taro"]} @conn.modify("cn=Ruby Taro,o=RubyKaigi2010,c=jp", mod_hash) # => #<LDAP::Conn:0xb7f0bbc8> HashやLDAP::MOD_MOD でエントリ更新 上記の例は Hash の場合
  • 36. Code Examples – ruby-ldap (5) Gathering Error Information LDAP::Error begin @conn.delete("cn=Ruby Taro,o=RubyKaigi2010,c=jp") rescue => e e # => #<LDAP::ResultError: No such object> e.message # => "No such object“ @conn.err # => 32 @conn.err2string(@conn.err) # => "No such object" end 原則として LDAP::Error が投げられる様子 Human Readable なメッセージは LDAP::Error 自身が持っている エラーコードが欲しい場合に #<LDAP::Conn> に問い合わせる
  • 37. Code Examples – net-ldap(1) Connection and BIND Net::LDAP.new @ldap = Net::LDAP.new :host => 'localhost', :port => 389, :base => 'o=RubyKaigi2010,c=jp', :auth => { :method => :simple, :username => 'cn=Manager,o=RubyKaigi2010,c=jp', :password => password } @ldap # => #<Net::LDAP:0xb7e086f4 @base="o=RubyKaigi2010,c=jp",…> 接続と bind を一緒に行うのが通例
  • 38. Code Examples – net-ldap(2) search Net::LDAP#search @ldap.search # => [#<Net::LDAP::Entry: ...>, #<Net::LDAP::Entry ...>] @ldap.search(:filter => Net::LDAP::Filter.eq('uid', 'matz')) # => [#<Net::LDAP::Entry: … :uid=>["matz"], …>] デフォルトでは “(objectClass=*)” で検索 フィルタを利用する場合は Net::LDAP::Filter を利用して フィルタを構成する ブロックを渡してイテレーションさせることも可
  • 39. Code Examples – net-ldap(3) Add Net::LDAP#add attrs = { :objectclass => ["top", "inetOrgPerson", "posixAccount"], :cn => "ruby taro", :gidNumber => "1999", :homeDirectory => "/home/ruby_taro", :sn => ["ruby", "taro"], :uid => "ruby_taro", :uidNumber => "1999" } dn = "uid=#{attrs[:uid]},ou=Users,o=RubyKaigi2010,c=jp" @ldap.add(:dn => dn, :attributes => attrs) # => false @ldap.get_operation_result # => #<OpenStruct … "Success",…, code=0> ※何故か false を返してますが成功しています (僕の環境のせい?)
  • 40. Code Examples – net-ldap(4) Modify Net::LDAP#modify dn = "uid=ruby_taro,ou=Users,o=RubyKaigi2010,c=jp" opts = [ [:add, :mail, "hoge@example.com"], [:replace, :sn, ["hoge", "fuga"]], [:delete, :telephoneNumber] ] @ldap.modify(:dn => dn, :operations => opts) # => false ※これも何故か false を返してますが成功しています (僕の環境のry)
  • 41. Code Examples – net-ldap(5) Gathering Error Information Net::LDAP#get_operation_result @ldap.add(:dn => dn, :attr => attr) # => false @ldap.get_operation_result.code # => 2 @ldap.get_operation_result.message # => "Protocol Error" @ldap.get_operation_result.error_message # => "no attributes provided" @ldap.get_operation_result.matched_dn # => "" @ldap.get_operation_result # => #<OpenStruct …> OpenStruct でエラー情報を返す 上記は objectClass の MUST の属性を設定していない場合の例
  • 42. Code Examples – activeldap(1) Connection and Bind ActiveLdap::Base.setup_connection ActiveLdap::Base.setup_connection :base => "o=RubyKaigi2010,c=jp", :bind_dn => "cn=Manager,o=RubyKaigi2010,c=jp", :password_block => lambda{pass}, :logger => logger この時点では接続が確立されず、何か操作した時に接続 サブクラス毎に接続先を変えること等も可能
  • 43. Code Examples – activeldap(2) Mapping define subclass class User < ActiveLdap::Base ldap_mapping :prefix => "ou=Users", :classes => %w(person), :scope => :sub, :dn_attribute => "uid" end クラスを任意のツリーにマッピング このクラスを利用して指定したツリー以下の検索等を行う インスタンスを作成するとエントリにマッピングされる belongs_to, has_many 等も利用できる 全体的に ActiveRecord と類似したインターフェース
  • 44. Code Examples – activeldap(3) Search ActiveLdap::Base.find User.find(:all) # => [#<User ...>, #<User ...>, ...] User.find(:first, :filter => “(cn=Ruby Taro)”) #=> #<User ...> ActiveRecord と同様の検索方法 検索条件は :filter オプション エントリとマッピング済みのインスタンスを返す
  • 45. Code Examples – activeldap(4) Add/Modify ActiveLdap::Base#save , save! user = User.new :sn => 'Ruby', :cn => "Ruby Taro" user.save # => true user.sn = “Hoge” user.save # => true インスタンスの状態に合わせて add/modify 新規オブジェクトなら add 既存オブジェクトなら modify 属性に複数の値を入れたい場合は配列で
  • 46. Code Examples – activeldap(5) Gathering Error Information ActiveRecord::Validations#errors user = User.new :sn => 'Ruby', :cn => "Ruby Taro" user.save # => false user.errors # => #<ActiveRecord::Errors ...> user.errors.full_messages # => ["distinguishedName is duplicated: cn=Ruby Taro,ou=Users,o=RubyKaigi2010,c=jp"] errors メソッドが ActiveRecord::Errors を返す Rails で Webインターフェース等作る際は比較的楽
  • 48. 参考資料 LDAP RFC 4510 http://datatracker.ietf.org/doc/rfc4510/ Rubyist Magazine - ActiveLdap を使ってみよう(前編)- LDAPとは http://jp.rubyist.net/magazine/?0027-ActiveLdap#l4 ruby-ldap Ruby/LDAP (Homepage) http://ruby-ldap.sourceforge.net/ RDoc http://ruby-ldap.sourceforge.net/rdoc/ ソースコード。特に test ディレクトリ以下 net-ldap Net-ldap-0.1.1 Documentation (Homepage) http://net-ldap.rubyforge.org/ activeldap ActiveLdap を使ってみよう(前編) http://jp.rubyist.net/magazine/?0027-ActiveLdap ActiveLdap を使ってみよう(後編) http://jp.rubyist.net/magazine/?0029-ActiveLdap Rails で作る ActiveDirectory と連携した社内システム http://www.clear-code.com/archives/rails-seminar-technical-night/ ActiveLdap 日本語チュートリアル http://code.google.com/p/ruby-activeldap/wiki/TutorialJa