我们正在使用Grails框架创建一个多租户系统。我们的数据库使用MongoDB,我们的多租户策略共享同一个数据库,这意味着大多数文档将具有一个租户ID引用。
我们正在寻找在执行数据库查询和更新时插入或过滤租户ID的插件或常用方法。
任何的想法?
谢谢
一种可能的方法:
可以通过使用ApplicationListener监听PreQuery事件来挂接到查询(类似于处理PreUpdate事件等,请参阅GORM文档)。然后,您可以转换org.grails.datastore.mapping.query.Query对象,以添加其他条件以按租户ID进行过滤。您可以通过适当地设置ThreadLocal或通过将其作为会话配置添加到当前会话中,来使适用的租户ID可供PreQuery事件侦听器访问(请参见Session.setSessionConfig)。您可以使用过滤器自动为请求启用租用过滤(这将根据请求参数或其他参数设置线程本地或会话配置)。显然,您会将所有这些内容包装在某些服务中,最好是在一个插件中。
一个问题是,“ get”和“ getAll”请求(也用于内部获取某些关联)目前绕过Query对象,因此避免了您应用的任何过滤,尽管这大概不会成为问题,因为ID在全球范围内是唯一的,但您可能想添加健全性或安全性检查,以确保不违反租约。动态查找器和其他查询方法(其中,DetachedCriteria等)应该可以(“ findById”可以过滤,但“ get”不能)。显然,任何直接GMongo查询也将绕过此功能。
当然,如果您愿意让您的控制器/服务代码对租约有所了解,则有很多替代方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句