Grails多租户与mongodb

时间:2014-02-01 15:28:03

标签: mongodb grails multi-tenant

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

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

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

一种可能的方法:

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

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

当然,如果您对控制器/服务代码感到满意,可以了解一些替代方法。