Ruby on Rails 3 - 多租户 (acts_as_tenant) 与 Devise(用户默认按子域限定范围)



Gems

ruby 1.9.3
rails 3.2.11
devise 2.2.3
acts_as_tenant 0.2.9

法典

我的所有模型都以domain_id为范围:

class User < ActiveRecord::Base
  acts_as_tenant(:domain)
  #...
end

然后,在我的application_controller中,我从域中设置了当前租户:

class ApplicationController < ActionController::Base
  set_current_tenant_through_filter
  before_filter :set_tenant
  protect_from_forgery
  #...
  def set_tenant
    #...
    @domain = Domain.find_or_create_by_name(request.host)
    set_current_tenant(@domain)
  end
end

除会话外,所有模型都运行良好:每次加载页面时,它都会注销第一个使用另一个租户加载页面的用户。通过加载此页面,它将注销第一个 [...等等]

假设:当Alice访问域时,Rails加载current_tenant=alice_domain(ok)。一切都按预期工作,直到 Bob 访问另一个域,加载 current_tenant=bob_domain。当 Alice 刷新她的页面时,Rails 仍然有 current_tenant==bob_domain。Rails 检查会话:Alice 在bob_domain范围内不存在,因此 Devise 强制 Alice 注销。然后application_controller设置current_tenant=alice_domain...哪个注销鲍勃。

肮脏的解决方法:不要在用户模型中使用acts_as_tenant,在每个控制器中按域自己限定用户范围,然后覆盖设计以按域限定登录和注册的范围。而且我不确定如何让 Devise 了解会话中的当前域。顺便说一下,用用户中的手动default_scope替换acts_as_tenant也会遇到同样的奇怪错误。走这条路似乎很肮脏。

我正在寻找一个干净的解决方案好几天了。我将非常感谢任何帮助。

固定,在application_controller中,更改

before_filter :set_tenant

prepend_before_filter :set_tenant

以便在 Devise 检查用户的会话之前default_scope所有内容,包括用户。

相关内容

  • 没有找到相关文章

最新更新