1

我正在使用deviseapartmentgems 创建一个多租户应用程序。我正在使用 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)登录,我希望它成为可能,但登录后用户必须通过活动会话重定向到他们的相关子域。

4

2 回答 2

0

假设您要在User模型上保存子域,您可以在控制器中创建一个验证,您可以使用以下内容:

if user.subdomain == request.subdomain
  redirect_to root_url(subdomain: user.subdomain)
else
  everything_is_ok
end
于 2016-08-04T20:34:46.750 回答
0

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

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

  • 我有我所有用户的用户表。
  • 我有帐户表来存储子域及其创建者。
  • 而且我有account_permissions来找出谁被授权到哪里。

所以,当user1谈到 时user2.example.com,我正在查询我的Account_permissions,如果它有权限user2.example.com,我就放手。

这种方式似乎是有道理的。

于 2016-08-04T20:57:35.830 回答