使用Apartment禁用子域

时间:2019-02-18 18:34:18

标签: ruby-on-rails multi-tenant apartment-gem

我正在Rails应用程序中使用公寓宝石。

我有一个数据库,其中每个租户都有架构,而租户表有一个公共架构。

我已经排除了www子域:

Apartment::Elevators::Subdomain.excluded_subdomains = ['www']

然后,如果我输入public.page.comwww.page.com,Apartment将不会切换到另一位租户,但它将留在公共房间。当然,“公共”本身不是租户,而只是租户之间的公共数据,因此,我不希望任何用户使用公共架构。

避免这种情况的正确方法是什么?

此应用程序在AWS上运行,因此,路由53将阻止这种情况,但是,尽管我希望避免Rails通过该子域提供请求。

1 个答案:

答案 0 :(得分:1)

除了从Apartment中排除域外,您还需要将其从路由中排除。 在我的项目中,我正在使用以下代码进行管理:

我正在使用初始化程序创建排除的子域数组。

# config/initializers/apartment/subdomain_exlusions.rb
Apartment::Elevators::Subdomain.excluded_subdomains = ['www', 'admin']

然后,我们可以在路由的辅助类中使用此数组。

# config/routes.rb
class ExcludedSubdomainConstraint
  def self.matches?(request)
    request.subdomain.present? && !Apartment::Elevators::Subdomain.excluded_subdomains.include?(request.subdomain)
  end
end

Rails.application.routes.draw do
  constraints ExcludedSubdomainConstraint do
    # here routes that are accessible in subdomains
  end
end

作为奖励,您可以将排除的子域路由到另一个约束


class DashboardSubdomainConstraint
  def self.matches?(request)
    Apartment::Elevators::Subdomain.excluded_subdomains.include?(request.subdomain) || request.subdomain == ''
  end
end

constraints DashboardSubdomainConstraint do
  namespace :dashboard do
    get '/settings'
  end
end

将为您提供类似www.domain.com/dashboard/settinigs的路由,并可以访问公共租户。

提示。您可以在关注中使用其他root方法