【问题标题】:DRY disable of Grails 4 multi-tenancy for admins为管理员禁用 Grails 4 多租户
【发布时间】:2021-09-23 15:55:53
【问题描述】:

我在 Grails 4 中使用基于鉴别器的多租户,从使用 hibernate-filter 插件的 Grails 2 升级。在 Grails 2 中,我可以在 Grails 过滤器中为管理员角色禁用休眠过滤器 - 因此在我的整个应用程序中不需要“if (admin)”检查。我可以在 Grails 4 中以某种方式禁用多租户并使其保持干燥吗?

根据 Jeffs 的评论,我重新表述我的问题以供将来参考:

只要可以验证请求来自具有管理员角色的客户端,是否可以完全禁用整个请求的多租户?

【问题讨论】:

  • 您是否希望在可以验证来自具有admin 角色的客户端的请求时为整个请求完全禁用多租户?
  • 没错。你的措辞比我好 :-) 如果你知道任何潜在的解决方案,它将为我节省大量代码。
  • 您的多租户代码是使用@CurrentTenantTenants.withCurrent、组合还是其他?
  • 我正在更新,但现在我两个都没有使用。我只使用@WithoutTenant 和Tenants.withoutId(在hibernate-filter-plugin 的哲学中)。它“似乎有效”并且在某种程度上肯定适用于租赁,但我刚刚在谷歌上搜索它应该在任何地方都使用提到的当前方法?目前有点困惑,为什么它在没有这些的情况下工作以及管理员选择性地包含这些的含义。下周我会试一试,然后可能会回复你。谢谢!
  • “你确定这不是惯例吗...” - 可能是我误解了上面的描述,但我不清楚你的系统是如何工作的。如果它开始看起来像一个错误,请在github.com/grails/grails-data-mapping/issues 提交一个带有示例应用程序的问题,我们可以进行调查。祝你好运!

标签: grails grails-orm grails-4


【解决方案1】:

我想我终于找到了解决办法。调试 Grails 我在 AbstractHibernateDatastore.java 中找到了这个:

Serializable currentId = Tenants.currentId(this);
if(ConnectionSource.DEFAULT.equals(currentId)) {
  disableMultiTenancyFilter();
}

当我想禁用多租户时(在我的情况下,当前用户是管理员),这让我想到了简单地返回 ConnectionSource.DEFAULT 而不是租户解析器中的租户 ID。

一个简单直接的解决方案,适用于 Grails 4.0.12。我会看看我是否可以将它正式记录下来,因为我的管理用例对于多租户应用程序来说应该并不少见。

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多