【发布时间】:2021-05-05 03:31:20
【问题描述】:
如果您使用过 Google Docs、Notion、Figma 等。它们的共同点是强大的权限方案。
以 Notion 为例,这里有一些你可以分享的方式
- 邀请工作区中的所有人
- 分享到网络(完全公开)
- 通过电子邮件分享
每种分享方式都有权限级别 (https://www.notion.so/Sharing-permissions-524c32ac63dc424a842891ace7a99bf8#73fc49683ef64589a1a6ed5fdcb67adc)
- 完全访问权限
- 可以编辑
- 可以评论
- 可以查看
在我的项目中,我使用 Prisma 2 和 GraphQL (GraphQL Nexus)。这是我关注的一个很好的指南https://www.prisma.io/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e,它谈到了directive permissions。
我的问题是如何根据所有者的意愿创建权限?看来我需要在数据库中创建一个新表来管理权限。
此示例展示了当您在 User 模型上已有角色字段时该怎么做。这意味着用户可以是Manager,也可以不是直接与用户模型交互。
const Query = {
vehicles: async (parent, args, context, info) => {
const vehicles = await context.db.query.vehicles({
where: { dealership: args.id },
})
const user = getUser(context)
return vehicles.map(vehicle => ({
...vehicle,
costBasis: user && user.role.includes(`MANAGER`) ? vehicle.costBasis : null,
numberOfOffers: user ? vehicle.numberOfOffers : null,
}))
},
}
如果在许多不同的文档上可能有许多不同的访问级别,那么更新 User 模型是没有意义的...
有意义的是,您创建一个 ID 为 123 的文件,然后作为所有者,您可以指定谁可以访问该文档以及他们的权限级别。所以你会想把它卸载到一个新的表上。
-------------------------------
id | docid | userid | level
-------------------------------
909 | 123 | 300 | "Read"
899 | 123 | 310 | "Write"
然后从这里开始,您将允许根据用户的请求运行突变,检查用户尝试访问的文档 ID,然后在权限表中通过查找所有内容来检查用户 ID 是否存在与文档 ID 匹配的记录,然后您将拉取权限级别并返回适当的数据。
我的想法正确吗?
【问题讨论】:
标签: database postgresql database-design graphql prisma