使用 Prisma 2 和 PostgreSQL 构建权限表以根据权限级别授权用户?
Posted
技术标签:
【中文标题】使用 Prisma 2 和 PostgreSQL 构建权限表以根据权限级别授权用户?【英文标题】:Building a permissions table with Prisma 2 and PostgreSQL to authorize users based on permission level? 【发布时间】: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 匹配的记录,然后您将拉取权限级别并返回适当的数据。
我的想法正确吗?
【问题讨论】:
【参考方案1】:好问题!
这是一篇关于 How to Auth: Securing your GraphQL Permissions 的精彩文章,解释了如何在 GraphQL API 上实现权限。
如果您遇到任何问题,请随时告诉我们。 ?
【讨论】:
以上是关于使用 Prisma 2 和 PostgreSQL 构建权限表以根据权限级别授权用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 prisma / postgresql 中拥有自定义 ID?