繁体   English   中英

Rails:使用 Devise 和 Apartment gem 的多租户

[英]Rails: Multi-tenancy with Devise and Apartment gem

我正在使用deviseapartment gems 创建一个多租户应用程序。 我正在使用 postgresql 数据库。 我创建了几个模型。 'User' model 在全局命名空间中,用于 devise gem 的身份验证。 在租户命名空间中还有一些其他模型(例如项目、设置等)。

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

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

现在,问题是,我可以使用任何 email 登录到任何子域,租户记录将根据地址栏中存在的子域显示。 例如,我可以在user2.example.com使用user1@gmail.com登录,它将成功验证并显示user2租户的记录。

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

更新#1:

我能够通过使用次要的 devise 配置来限制用户登录到他们的特定子域。 devise.rb文件中,我在身份验证密钥列表中添加了:subdomain属性,因此它还将检查正确的子域值以及 email,但是我不确定如何正确地向登录表单提供子域值。 我可以在登录表单中使用这样的隐藏字段<%= 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模型上保存子域,您可以在控制器中创建一个验证,您可以使用以下内容:

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

如果您将子域存储在User表中,并且通过request.subdomain检查它,那么有人如何加入另一个租户(公司)? 它们可以包含在多个公司中。

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

  • 我为所有用户提供了用户表。
  • 我有一个帐户表来存储子域名及其创建者。
  • 我已经通过account_permissions来了解谁被授权到哪里。

因此,当user1访问user2.example.com ,我正在查询我的Account_permissions ,如果它有user2.example.com权限,我就放手。

这种方式似乎很有道理。

如果有人仍然有类似的问题并且不是 ROR 的专家,我建议先构建基本应用程序,然后使用该视频将其制作成多租户。 构建你的应用程序后,你只需要安装公寓 gem,然后制作一个 model 存储租户信息,然后将其排除在多租户之外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM