【发布时间】:2014-02-01 15:28:03
【问题描述】:
我们正在使用 Grails 框架创建一个多租户系统。我们的数据库使用 MongoDB,我们的多租户策略是共享同一个数据库,这意味着大多数文档都会有租户 ID 参考。
我们正在寻找一个插件或一种在进行数据库查询和更新时注入或过滤租户 ID 的常用方法。
有什么想法吗?
谢谢
【问题讨论】:
标签: mongodb grails multi-tenant
我们正在使用 Grails 框架创建一个多租户系统。我们的数据库使用 MongoDB,我们的多租户策略是共享同一个数据库,这意味着大多数文档都会有租户 ID 参考。
我们正在寻找一个插件或一种在进行数据库查询和更新时注入或过滤租户 ID 的常用方法。
有什么想法吗?
谢谢
【问题讨论】:
标签: mongodb grails multi-tenant
一种可能的方法:
可以通过使用 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 查询也将绕过此功能。
当然,如果您愿意让您的控制器/服务代码了解一些有关租赁的信息,那么还有很多替代方法。
【讨论】: