我正在从自定义用户权限管理系统迁移到Alanning:roles v2.0。我有一个非常基本的结构:
- 一个基础用户
- 用户组,每个用户都有特定的设置。我将它们存储在“组”集合中。
- 管理组的用户的组管理员状态(每个组都有其组管理员)。
我之前将组成员和管理员 mongo 存储_id
在“组”文档中。这样,我可以反应性地发布组:我只需要检查userId
组文档中的“成员”或“管理员”字段中是否存在。
现在我切换到由 Alanning:roles 强制执行的正确管理,我在我的出版物中做了这样的事情:
const userGroupsAsAdmin = Roles.getPartitionsForUser (this.userId, ['group_admin'])
const userGroupsAsMember = Roles.getPartitionsForUser (this.userId, ['member'])
const selector = {$or:[{'_id':{$in: userGroupsAsMember}},{'_id':{$in: userGroupsAsAdmin}}]}
const options = {}
const response = Groups.find(selector, options)
return response
请注意,这Roles.getPartitionsForUser ()
只是Roles.getGroupsForUser ()
.
这里的问题是发布不会监视role
集合中的更改,因此当用户成为成员时,发布不会更新。我知道这是一个常见问题,并且我知道解决此问题的 3 种方法,但没有一种方法能令人满意:
最佳候选:非规范化和复制。我将我的
members
和admins
字段保存在组文档中。让我烦恼的是,我将保留同一事物的 2 个版本,并创造出现不一致的可能性。向发布添加一个参数并使用此参数重新运行它(例如
userGroupsAsMember
),但它依赖于客户端并使其发送不必要的信息。直接或使用包使用低级发布 api 。我过去已经直接这样做了,但我不想再依赖
Cursor.observe()
了,因为它不能有效地扩展并产生不必要的服务器负载。
我错过了一个选择吗?如果不是,那么让我的出版物保持反应性的最佳方法是什么?