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
非常感谢任何建议。
答案 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'
如果子域存在于此,则将找到该路径。如果请求不是使用子域进行的,那么将无法找到它。