すべてのユーザーが異なるサブドメインで異なるロールを持つことができるマルチテナント アプリケーションがあります。テナント、ユーザー、およびロールを結合するテーブル UserRight があります。ユーザーが特定のテナント/サブドメインに登録されているかどうかを確認するために (ユーザーとテナントを結合する UserRights に行がある場合は登録があります)、self.find_for_authentication メソッドを上書きしました。次のようになります。
def self.find_for_authentication(warden_conditions)
p "DEBUG"
if user = User.find_by_email(warden_conditions[:email])
t = Tenant.find_by_subdomain(warden_conditions[:subdomain])
for_auth = UserRight.find(:first, :conditions => ["user_id = :u and tenant_id = :t", {:u => user, :t => t}])
return for_auth.user if !for_auth.nil?
end
end
複数のデータベースには Apartment を使用し、認証には Devise を使用します (これが重要な場合)。問題は、サブドメインにいるときはこのメソッド (find_for_authentication) が呼び出されることですが、マスター ドメイン (サブドメインなし) にいるときは、ログイン時にこのメソッドがまったく呼び出されないことです。メールアドレスまたはパスワードが間違っていると言います。
工夫によって、find_for_authentication が呼び出された場所が見つかりませんでした。