Rails acts_as_tenant - 希望在没有子域的情况下阻止访问我的网站

时间:2012-11-03 23:37:16

标签: ruby-on-rails subdomain multi-tenant

acts_as_tenant gem非常有效。保存和检索多个租户的数据没有问题。但是,当我访问没有子域的开发站点时,我遇到了一个挑战。

问题:如果我没有指定子域,来自任何租户的用户仍然可以登录。

示例 - cheese.lvh.me:3000的用户将无法登录并访问bacon.lvh.me:3000中的数据(反之亦然)。但是奶酪和培根用户都可以登录lvh.me:3000。登录后,租户范围不再适用,因此所有新插入都将获得NULL account_id。

我喜欢:如果未指定子域,则阻止用户登录。

我正在使用来自热门的railstutorial.org的M.Hartl用户登录方法。

def create
  user = User.find_by_email(params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password]) 
    sign_in user
    flash[:success] = "Welcome user!"
    redirect_to users_path
  else
    flash.now[:error] = 'Invalid email/password combination'
    render 'new'
  end
end

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

我能想到的最简单的方法是在子域约束中包含您不想访问的路径而不是子域:

constraints(SubdomainRequired) do
  # routes go here
end

我认为,这个SubdomainRequired常量最好在应用程序的lib/constraints目录中,在以类(lib/constraints/subdomain_required.rb)命名的文件中定义:

class SubdomainRequired
  def self.matches?(request)
    request.subdomain.present?
  end
end

然后,只需在路径文件的顶部要求此约束:

require 'constraints/subdomain_required'

如果子域存在于此,则将找到该路径。如果请求不是使用子域进行的,那么将无法找到它。