ruby-on-rails - rails : Multi-tenancy with Devise and Apartment gem

标签 ruby-on-rails postgresql devise apartment-gem

我正在使用 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/

相关文章:

ruby-on-rails - 使用 Webpacker 和 Rails 导入 npm 包的图像

ruby-on-rails - rails 上的 ruby : Bundle update giving errors in Windows

postgresql - postgresql 上的 pg_global 和 pg_default 有什么区别?

ios - Rails Search 无法在 Heroku 的移动设备上运行

ruby-on-rails - 我可以将 shoulda 与 mongoid 一起使用吗?

ruby-on-rails - 事件管理员,不能与父级同时创建嵌套资源

python - 使用 psycopg2 从 python 中的元组中提取字符串

node.js - 放置在 Sequelize 中的 WHERE 子句中的值,PostgreSQL 以获取所有内容

ruby-on-rails - 如何编写 Devise 扩展(使用自定义数据存储)

ruby-on-rails - Rails ActionView::Template::Error:Nill 类的未定义方法