~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

Sinatra + ActiveLDAPで簡易LDAP管理インターフェースを作った

Posted on Sun May 09 16:50:08 +0900 2010 by nabeken

自宅のメールサーバのアカウント情報をLDAPで一元化するためにLDAPの導入を決めました。問題は管理インターフェースです。 そこで、RubyのSinatraの習作としてLDAP管理Webインターフェース作成しました。開発のなかで気になった点を記します。

使用したソフト:

  • Rack
  • Sinatra
  • haml
  • ActiveLDAP
  • MongoDB (セッションの永続化)

Sinatra

チュートリアルが日本語で用意されています。 基本的な事項はこのチュートリアルで事足ります。

しかし、何か不明瞭な点があれば、ググるよりも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でDigest認証を行なう

Rack::Auth::Digest::MD5を使ったでDigest認証のシンプルなサンプルコードが見つからなかったので、私の作成したものを載せておきます。 大前提として、最低限でもDigest認証のHTTPレベルでの仕組みを理解しておく必要があります。

Rack::Auth::Digest::MD5に渡すブロックでパスワードを返します。このとき、ブロック引数にはユーザ名が入るので、 Hash等を使いユーザ名に応じたパスワードを返すことができます。

Rack::Auth::Digest::MD5のインスタンス(auth)のcallメソッドを呼ぶことで実際の認証処理が走ります。 問題は認証を通過すると、最後にインスタンス化時に渡した第1引数のオブジェクトのcallメソッドを呼んでいます。 そのため、Rubyの継続を使いアプリ側へ制御を戻す処理が必要となります。

認証が通らない場合(ステータスコード401)throwメソッドで即時に処理を中断しています。

参考文献

ActiveLDAPでldaps://を使う

ポート番号を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" }

参考文献

更新履歴

  • 初稿 (Sun, 9 May 2010 16:50:08 +0900)