使用Apartment禁用子域名

问题描述 投票:0回答:1

我在rails应用程序中使用了公寓gem。

我有一个数据库,每个租户都有模式,租户表有一个公共模式。

我已经排除了www子域名:

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

然后,如果我输入public.page.comwww.page.com,公寓将不会转换到另一个租户,但它将保留在公共租户。当然“公共”不是租户本身,只是租户之间的通用数据,所以,我不希望任何用户使用公共架构。

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

此应用程序在AWS上运行,因此,路由53将阻止此操作,但是,尽管我想避免通过此子域服务请求的rails。

ruby-on-rails multi-tenant apartment-gem
1个回答
1
投票

除了从公寓中排除域名,您需要将它们排除在路线之外。在我的项目中,我使用此代码来管理:

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

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

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

# 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方法

© www.soinside.com 2019 - 2024. All rights reserved.