WEBrick で Basic 認証を行う

趣旨

WEBrick で Basic 認証を行ってみる。

#!/usr/local/bin/ruby
require 'webrick'

include WEBrick

mime_types = HTTPUtils::DefaultMimeTypes
mime_types['rhtml'] = 'text/html'

server = HTTPServer.new( 
	:Port => 2000,
	:MimeTypes => mime_types,
	:DocumentRoot => File.expand_path(File.dirname(".")) + "/htdocs",
        :RequestCallback => lambda do |req, res|
           if req.path =~ %r(^/private/) 
             HTTPAuth.basic_auth(req, res, "my realm") do |username, password|
               username == 'guest' && password == 'passwd'
             end
           end
        end
)

trap("INT"){ server.shutdown }
server.start

この例では、/private 配下へのリクエストに対して Basic 認証をかけている。

動作原理

RequestCallback というオプションで、サーブレットへ処理がわたる直前のタイミングでチェックを行う。HTTPAuth.basic_auth はブロックの戻り値が true でないと、HTTPStatus::Unauthorized 例外を投げる。例外が送出されると、後続のサーブレット処理がキャンセルされ、401 Unauthrized がクライアントに返される。

詳しくは webrick/httpserver.rb を参照のこと。

つぶやき

WEBrick は美しい設計のすばらしいウェブサーバである。だが、皆がいうようにマニュアルがほとんどない。というのもおそらくソースコードが美しすぎて、マニュアルを読むよりソースコードを読んだほうが早いからかもしれない。Ruby だとそんなことはしばしば起こる。