我正在使用 devise
创建一个 Multi-Tenancy 应用程序和 apartment
gem 。我正在使用 postgresql 数据库。我创建了几个模型。 “用户”模型位于全局命名空间中,用于设计 gem 的身份验证。在租户命名空间中还有一些其他模型(例如项目、设置等)。
我已按照本教程创建此 Multi-Tenancy 应用程序:https://gorails.com/episodes/multitenancy-with-apartment?autoplay=1
Multi-Tenancy 功能在某种意义上工作正常,如果我从他们的相关帐户(例如 user1@gmail.com 和 user2@)登录到两个单独的子域(例如 user1.example.com 和 user2.example.com) gmail.com) 它工作正常,我可以为每个租户创建唯一的记录。
现在,问题是,我可以使用任何电子邮件登录到任何子域,租户记录将根据地址栏中存在的子域显示。例如我可以用 user1@gmail.com
登录在 user2.example.com
它将成功验证并显示 user2
的记录租客。
我的问题是,登录时如何检查当前用户的子域是否与请求的子域(在地址栏上)匹配,如果匹配则继续进行身份验证并显示管理仪表板,如果不匹配(从错误的子域或从TLD) 对用户进行身份验证,但将他重定向到其相关子域的仪表板。我该怎么做?
更新#1:
我能够通过使用较小的设计配置来限制用户登录到他们特定的子域。在 devise.rb
我添加的文件 :subdomain
身份验证 key 列表中的属性,因此它还将检查正确的子域值和电子邮件,但是我不确定如何正确地向登录表单提供子域值。我可以在登录表单中使用这样的隐藏字段 <%= f.hidden_field :subdomain, value: request.subdomain %>
但它是可破解的,因为用户可以从浏览器检查器更改它的值。
更新#2:
我能够应用一种万无一失的方法来限制用户登录到他们特定的子域。我遵循了这种方法:https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain
现在,我唯一的问题是用户无法从 TLD(例如 example.com)登录,我希望它成为可能,但在登录后用户必须通过事件 session 重定向到他们的相关子域。
最佳答案
假设您将子域保存在 User
模型中,您可以在 Controller 中创建一个验证,您可以使用如下内容:
if user.subdomain == request.subdomain
redirect_to root_url(subdomain: user.subdomain)
else
everything_is_ok
end
关于ruby-on-rails - rails : Multi-tenancy with Devise and Apartment gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38772245/