Time to Read
2分
先日のポストの続き、と言うより一例として、 Lokka に対しての Rack Middleware の使い方を見てみたい。
Lokka は軽量でステキな、 Sinatra ベースの CMS で、オープンソースの権化みたいなクールな会社フィヨルドさんで開発、メンテナンスをされている。個人的にも使わせていただいているソフトウェアなのだけれど、今回の利用にあたって例えば以下のカスタマイズ要件が必要になったとする。
- 身内向け告知用 CMS のため、 heroku にデプロイする以上、一応 Basic 認証をかけたい
- さらに、 http でのアクセスは、全部強制的に https にリダイレクトしたい
全部 Rack Middleware でできます。
まず、 Basic 認証ミドルウェアは、 Rack に標準添付されています。
config.ru を編集。
1 2 3 4 5 6 7 8 | Encoding.default_external = 'utf-8' if defined?(Encoding) && Encoding.respond_to?('default_external') require './init' use Rack::Auth::Basic do |username, password| username == 'hogehoge' && password == 'fugafuga' end run Lokka::App |
そこまで本気でナイショにしたいサイトではないので、ユーザ名とかは適当かつ一つだけにしておく……。
次に、二番目の「 SSL にしたい」要件、そのものずばりな Rack::SSL が存在します。
Gemfile を編集。
1 | gem 'rack-ssl', '1.3.2', :require => 'rack/ssl' |
config.ru をさらに編集。
1 2 3 4 5 6 7 8 9 10 11 | Encoding.default_external = 'utf-8' if defined?(Encoding) && Encoding.respond_to?('default_external') require './init' require 'rack/ssl' # needs require here... use Rack::SSL use Rack::Auth::Basic do |username, password| username == 'hogehoge' && password == 'fugafuga' end run Lokka::App |
追記: 最初は Rack::Auth::Basic -> Rack::SSL の順に記述していたが、これだとhttp側でもhttps側でも認証に引っかかるのでは? と思い順番を逆にした。
本番環境にだけ強制 SSL をしたいのであれば、 RACK_ENV を見れば良いのではないかと。
5 6 7 | if ENV['RACK_ENV'] == 'production' use Rack::SSL end |
また、たとえば「/admin 以下の管理画面だけ……」と言う場合なんかもあるだろうが、いつぞや紹介した Rack::Rewrite を使えば上手にできると思う。
これで、数分の改修で、 Lokka 本体の基本機能に一切影響を与えることなく、「ページ全体の基本認証」と「強制 SSL リダイレクト」を実装することができた。 Rack を使えばラックラクですね!
* * *
ここでのポイントは、 Lokka だけでなく、 Sinatra 、 Padrino 、さらには Ramaze やら、あるいは最近の tDiary などでも、ほぼまったく同じ DSL を加えれば、同じ要件が実現できるということですね( Sinatra 系フレームワークなら Sinatra::Base を継承したクラスに直接書きたい、などの方針は出てくるでしょうが / また、 Rails であれば正直今回は Rails 自体の機能で実現できるでしょう……)。
さらに言うと、実質 6~8行 しかコードを追加していない、と言うところも注目されたい。
ということで、ある機能の実現のためのむやみな車輪の再発明が減ったり、みんなが新規に開発して Rack Middleware が増えたりすると嬉しいんじゃないかな~と思っています。




