【发布时间】:2019-05-16 18:22:22
【问题描述】:
我正在制作一个应用程序,它使用 Apartment 进行多租户并使用 Devise 进行用户身份验证。
最初,会创建一个租户实例,然后将重定向到 subdomain.lvh.me/users/sign_up 以便用户可以注册并且仅是该特定子域架构的一部分。这样用户只被授权登录他们最初注册的子域,这就是我想要的。这也是有益的,因为我将每个 id=1 的用户设置为管理员,因此每次创建新租户时,它都会重定向到子域,并且第一个注册的用户将是默认管理员(有意义,因为用户会开始登陆页面,创建公司帐户(租户),然后创建一个包含其姓名、电子邮件、密码等的用户帐户,他们将是与该租户关联的第一个用户,因此是默认管理员。
这很有效,因为来自登陆页面的人(想象一下团队负责人 - 营销总监或其他)可以注册产品并设置公司信息,并且成为第一个具有管理员权限的用户。团队中的每个员工都将在子域上注册,并且无权登录另一个子域,或者他们必须在登录页面上注册,在这种情况下,他们将被视为新公司正在注册,而不是只是一个用户。
最近我实现了嵌套属性,以便我可以在一个表单/视图中完成初始注册过程,而不是两个。问题是因为用户实例是在租户控制器中创建的,它不是公司子域架构的一部分,因此无法登录 subdomain.lvh.me/users/sign_in。
我想知道之前是否有人遇到过这个挑战,以及您的解决方案是什么。改回原来的样子,先创建Tenant,重定向到subdomain/sign_up,再创建第一个User,会不会更好?
很抱歉,如果我没有尽可能清楚地表达这一点。
我在调用@tenant.users.build 之前尝试过重定向到子域,但它并没有像我想象的那样工作。
tenants_controller.rb 的一部分
def new
@tenant = Tenant.new
@tenant.users.build
render layout: false
end
def create
@tenant = Tenant.new(tenant_params)
@tenant.update_attribute :subdomain, @tenant.company.downcase
respond_to do |format|
if @tenant.save
format.html { redirect_to "http://#{@tenant.subdomain}.lvh.me:3000/users/sign_in", notice: 'Domain was successfully created.' }
#format.html { redirect_to new_user_registration_path, notice: 'Tenant was successfully created.' }
format.json { render :show, status: :created, location: @tenant }
else
format.html { render :new }
format.json { render json: @tenant.errors, status: :unprocessable_entity }
end
end
end
【问题讨论】:
-
“成为该特定子域架构的一部分”是什么意思
-
也许我理解的不够准确,但从我读过的内容来看,每个子域都有一个单独的数据库模式,这就是为什么在我嵌套属性之前你可以在一个子域上创建一个帐户,它会'没有任何其他子域的授权
标签: ruby-on-rails multi-tenant