【问题标题】:Building a permissions table with Prisma 2 and PostgreSQL to authorize users based on permission level?使用 Prisma 2 和 PostgreSQL 构建权限表以根据权限级别授权用户?
【发布时间】: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


    【解决方案1】:

    好问题!

    这是一篇关于 How to Auth: Securing your GraphQL Permissions 的精彩文章,解释了如何在 GraphQL API 上实现权限。

    如果您遇到任何问题,请随时告诉我们。 ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多