deviseでbasic認証と通常の認証を組み合わせる場合の落とし穴

メモ。

deviseはRackというかwardenを利用した、Rails用の認証モジュール。便利なのだけれど、どうにもうまくログインができずはまった。

原因はbasic認証を併用していたこと。

現状、非公開のテスト用サイトのページにはbasic認証をかけている。Rails3では、basic認証Rails単独でも簡単に設定できる。とりあえず簡易に使用するには、config.ruファイルの「run Foo::Application」の前にこう書くだけ。

use Rack::Auth::Basic do |user, passwd|
  user == 'foo' && passwd == 'bar'
end

ところが、deviseもデフォルトでbasic認証を見るというか、そこからユーザIDを拾ってくるのだった。むむむ。そのため、deviseでログインする際に使用したユーザIDではなく、basic認証のユーザIDが使われるようになり、誤作動が起きてしまう。

そうしないようにするためには、config/initializers/devise.rbで、以下のようにする必要がある。

config.http_authenticatable = false

これで、basic認証があってもなくても、deviseの(DBとクッキーによる)認証が利用できるようになる。