【问题标题】:Rails acts_as_tenant - would like to prevent access to my site without a subdomainRails act_as_tenant - 想阻止在没有子域的情况下访问我的站点
【发布时间】:2012-11-04 18:30:49
【问题描述】:

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

不胜感激。

【问题讨论】:

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


    【解决方案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'
    

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

    【讨论】:

    • 感谢您的详细回答。即使对 Rails 很陌生,该解决方案也很有意义。我会及时尝试并接受答案。
    • 抱歉更新晚了 - 我试过了,效果很好,谢谢!
    • 在部署到 Heroku 时,我不得不再挖掘一点……这些添加是为了让事情像在测试环境中一样工作:link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多