ruby-on-rails-3 - Multi-Tenancy (acts_as_tenant) 与 Devise(用户默认范围由子域限定)中断 session

标签 ruby-on-rails-3 session devise scope multi-tenant

gem

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

除了 session 之外,所有模型都适用于所有模型:每次加载页面时,它都会注销第一个加载页面的用户与另一个租户。通过加载此页面,它将注销第一个 [... 等] 的用户

假设:当 Alice 访问一个域时,Rails 会加载 current_tenant=alice_domain(好的)。一切都按预期进行,直到 Bob 访问另一个域,加载 current_tenant=bob_domain。当 Alice 刷新她的页面时,Rails 仍然有 current_tenant==bob_domain。 Rails 检查 session :Alice 不存在 bob_domain 范围,因此设计强制 Alice 注销。然后 application_controller 设置 current_tenant=alice_domain... 退出 Bob。

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

我正在寻找一个干净的解决方案好几天。我将不胜感激任何帮助。

最佳答案

已修复,在 application_controller , 改变

before_filter :set_tenant


prepend_before_filter :set_tenant

为了在设计检查用户的 session 之前对包括用户在内的所有内容进行 default_scope。

关于ruby-on-rails-3 - Multi-Tenancy (acts_as_tenant) 与 Devise(用户默认范围由子域限定)中断 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14664708/

相关文章:

ruby-on-rails - 如何使 check_box_tag 在未选中时发布 'false' 或 '0' 参数?

ruby-on-rails - 使用 send_file 从 Amazon S3 下载文件?

ruby-on-rails - 设置 Rails 时出现问题,sqlite 3 无法安装

php - 我的登录连接表中出现 session 问题

php - 错误 310(net::ERR_TOO_MANY_REDIRECTS):

ruby-on-rails - Rails ActiveModel::ForbiddenAttributesError 设计,Omniauth

ruby-on-rails - 如何将查询参数传递给 Devise 的登录页面

ruby-on-rails - 在任何来源中都找不到 gem mime-types-2.4.1

asp.net - session ASP.NET 超时

ruby-on-rails - 如何在 Rails 迁移中将数据从一个表移动到另一个表?