我正在使用devise
和apartment
gems 创建一个多租户应用程序。我正在使用 postgresql 数据库。我已经创建了几个模型。“用户”模型位于全局命名空间中,用于设计 gem 的身份验证。租户命名空间中还有一些其他模型(例如项目、设置等)。
我已按照本教程创建此多租户应用程序:https ://gorails.com/episodes/multitenancy-with-apartment?autoplay=1
从某种意义上说,如果我从他们的相关帐户(例如 user1@gmail.com 和 user2@gmail.com)登录到两个单独的子域(例如 user1.example.com 和 user2.example.com),多租户功能运行良好) 它工作正常,我可以为每个租户创建唯一的记录。
现在,问题是,我可以使用任何电子邮件登录到任何子域,并且租户记录将根据地址栏中存在的子域显示。user1@gmail.com
例如,我可以使用at登录,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)登录,我希望它成为可能,但登录后用户必须通过活动会话重定向到他们的相关子域。