2016-08-04 120 views
1

我正在使用deviseapartment宝石创建多租户应用程序。我正在使用postgresql数据库。我创建了几个模型。 '用户'模型位于全局命名空间中,用于由设计宝石进行身份验证。还有一些其他的模型(例如Project,Setting等)位于租户命名空间中。Rails:多租户设计和公寓宝石

我已经按照本教程创建这个多tenance应用:https://gorails.com/episodes/multitenancy-with-apartment?autoplay=1

的多租户功能工作正常在某种意义上,如果我登录到两个独立的子域(如user1.example.com和user2.example.com)从他们的相关帐户(例如[email protected][email protected]),它工作正常,我可以为每个租户创建独特的记录。

现在,问题是,我可以使用任何电子邮件登录到任何子域,租户记录将基于地址栏中的子域显示。例如我可以登录[email protected]user2.example.com,它会成功验证,并会显示user2租户的记录。

我的问题是,在登录时如何检查当前用户的子域名是否与所请求的子域名(在地址栏上)匹配,如果匹配,则继续进行身份验证并显示管理控制台仪表盘,如果没有(从错误的子域登录或来自TLD)认证用户,但将他重定向到他的相关子域的仪表板。我怎样才能做到这一点?

更新#1:

我是能够通过使用较小的色器件配置到用户登录限制到其特定的子域。在devise.rb文件中,我在认证密钥列表中添加了:subdomain属性,因此它也会检查电子邮件的正确子域值,但我不确定如何正确提供子域值给登录表单。我可以在登录表单<%= f.hidden_field :subdomain, value: request.subdomain %>中使用类似这样的隐藏字段,但由于用户可以通过浏览器检查器更改其值,因此它是可以破解的。

更新#2:

我能申请一个傻瓜证明方法来限制用户登录到他们的特定子域。我遵循这种方法:https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain

现在,我唯一的问题是,用户无法从TLD(例如example.com)登录,我希望它是可能的但登录后用户必须重定向到其相关的子与活着会话的域。

回答

0

假如你节省子域的User模型,你可以创建你的控制器验证您可以使用类似:如果您存储的子域在user表

if user.subdomain == request.subdomain 
    redirect_to root_url(subdomain: user.subdomain) 
else 
    everything_is_ok 
end 
+0

我假设我必须在':authenticate_user'过滤器之前挂钩这个条件,但作为新手我不知道该怎么做。你能解释一下吗?我还添加了对原始问题的更新。 –

0

,如果你检查它通过request.subdomain那么某人如何加入另一个租户(公司)?他们可以被包含在多个公司中。

这就是为什么我创建了2个中间表来处理它。

  • 我已经用户表为我所有的用户。
  • 我已经帐户表格存储子域名及其创建者。
  • 而我已经account_permissions找出谁被授权在哪里。

所以,当user1user2.example.com,我查询到我的Account_permissions,如果它具有权限user2.example.com,我让他走。

这种方式看起来很有意义。

+0

目前我是新来的铁路,并希望简化,所以我假设一个租户将只有一个用户。然而,你所建议的结构绝对看起来非常灵活。 –