使用 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?

TypeGraphql 和 Prisma 2 类型冲突

graphql prisma node js postgresql如何将创建日期/更新字段添加到graphql类型?

prisma查询postgresql到nestJs

使用 Prisma 订购嵌套/二级数组?

Prisma v2:生成一个 .graphql 文件来编辑?