【问题标题】:Grails Multi-tenant with mongodb [closed]带有 mongodb 的 Grails 多租户 [关闭]
【发布时间】:2014-02-01 15:28:03
【问题描述】:

我们正在使用 Grails 框架创建一个多租户系统。我们的数据库使用 MongoDB,我们的多租户策略是共享同一个数据库,这意味着大多数文档都会有租户 ID 参考。

我们正在寻找一个插件或一种在进行数据库查询和更新时注入或过滤租户 ID 的常用方法。

有什么想法吗?

谢谢

【问题讨论】:

    标签: mongodb grails multi-tenant


    【解决方案1】:

    一种可能的方法:

    可以通过使用 ApplicationListener 侦听 PreQuery 事件来挂钩查询(类似于处理 PreUpdate 事件等,请参阅 GORM 文档)。然后,您可以转换 org.grails.datastore.mapping.query.Query 对象以添加附加条件以按租户 ID 进行过滤。您可以通过适当地设置 ThreadLocal 或将其作为会话配置添加到当前会话中,使 PreQuery 事件侦听器可以访问适用的租户 ID(请参阅 Session.setSessionConfig)。您也许可以使用过滤器自动为请求启用租赁过滤(这将基于请求参数或其他设置线程本地或会话配置)。显然,您会将所有这些都包含在一些服务中,最好是一个插件。

    一个问题是 'get' 和 'getAll' 请求(也用于内部获取一些关联)当前绕过 Query 对象,因此避免了您应用的任何过滤,尽管这可能不会成为问题,因为 ID 将是全球唯一的,但您可能需要添加健全性或安全性检查以确保不违反租约。动态查找器和其他查询方法(where、DetachedCriteria 等)应该没问题('findById' 会过滤,但 'get' 不会)。显然,任何直接的 GMongo 查询也将绕过此功能。

    当然,如果您愿意让您的控制器/服务代码了解一些有关租赁的信息,那么还有很多替代方法。

    【讨论】:

    • 谢谢汤姆。这对我们来说似乎是一个非常好的解决方案。理想情况下,除非需要,否则我们真的不希望我们的服务逻辑通知租户。
    • 我没有提到模型保存方面的事情 - 一种选择是使用 PreInsertEvent 的 ApplicationListener 来处理为插入设置租户 ID(使用相同的会话/线程本地/spring bean/服务获取它)。
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2015-08-07
    • 2016-04-02
    • 2021-12-16
    相关资源
    最近更新 更多