[英]Rails: Multi-tenancy with Devise and Apartment gem
我正在使用devise
和apartment
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个中间表来处理它。
因此,当user1
访问user2.example.com
,我正在查询我的Account_permissions
,如果它有user2.example.com
权限,我就放手。
这种方式似乎很有道理。
如果有人仍然有类似的问题并且不是 ROR 的专家,我建议先构建基本应用程序,然后使用该视频将其制作成多租户。 构建你的应用程序后,你只需要安装公寓 gem,然后制作一个 model 存储租户信息,然后将其排除在多租户之外。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.