Posted on Sun May 09 16:50:08 +0900 2010 by nabeken
自宅のメールサーバのアカウント情報をLDAPで一元化するためにLDAPの導入を決めました。問題は管理インターフェースです。 そこで、RubyのSinatraの習作としてLDAP管理Webインターフェース作成しました。開発のなかで気になった点を記します。
使用したソフト:
チュートリアルが日本語で用意されています。 基本的な事項はこのチュートリアルで事足ります。
しかし、何か不明瞭な点があれば、ググるよりもSinatra/Rackのソースコードを覗いたほうが早いことが多いです。 手元にGitリポジトリを用意しておくといいでしょう(git grepですぐに検索できるので)。
$ git clone git://github.com/sinatra/sinatra.git
$ git clone git://github.com/rack/rack.git
Rackの動作を追う場合はRackのソースコードを弄りながら追うのが楽です。 そのためには、gitリポジトリのlib以下を優先的に使用する設定が必要です。
$ ruby -I../rack/lib/ myapps.rb
Rack::Auth::Digest::MD5を使ったでDigest認証のシンプルなサンプルコードが見つからなかったので、私の作成したものを載せておきます。 大前提として、最低限でもDigest認証のHTTPレベルでの仕組みを理解しておく必要があります。
Rack::Auth::Digest::MD5に渡すブロックでパスワードを返します。このとき、ブロック引数にはユーザ名が入るので、 Hash等を使いユーザ名に応じたパスワードを返すことができます。
Rack::Auth::Digest::MD5のインスタンス(auth)のcallメソッドを呼ぶことで実際の認証処理が走ります。 問題は認証を通過すると、最後にインスタンス化時に渡した第1引数のオブジェクトのcallメソッドを呼んでいます。 そのため、Rubyの継続を使いアプリ側へ制御を戻す処理が必要となります。
認証が通らない場合(ステータスコード401)throwメソッドで即時に処理を中断しています。
ポート番号を636、methodをsslにするとldaps://で接続できます。もちろん、IPv6対応。
ActiveLdap::Base.setup_connection :host => "ldap.example.org",
:port => 636,
:method => "ssl",
:base => "dc=example,dc=org",
:bind_dn => "cn=admin,dc=example,dc=org",
:password_block => lambda { "example" }