我有一个多租户应用程序,其中每个用户都可以在不同的子域中拥有不同的角色。有一个表 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 的位置。