我正在使用devise
和apartment
宝石创建多租户应用程序。我正在使用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)登录,我希望它是可能的但登录后用户必须重定向到其相关的子与活着会话的域。
我假设我必须在':authenticate_user'过滤器之前挂钩这个条件,但作为新手我不知道该怎么做。你能解释一下吗?我还添加了对原始问题的更新。 –