2

act_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

将不胜感激任何建议。

4

1 回答 1

2

我能想到的最简单的方法是将您不想在没有子域的情况下访问的路由包装在子域约束中:

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'

如果此子域存在,则将找到该路由。如果请求不是使用子域发出的,则不会找到它。

于 2012-11-04T10:30:49.820 回答