【问题标题】:Fine-grained Access Control - AWS Amplify细粒度访问控制 - AWS Amplify
【发布时间】:2023-06-01 22:30:01
【问题描述】:

我正在制作一个员工管理网络应用程序,该应用程序需要根据用户的部门和职位以及员工的部门和职位限制用户可以看到的内容。

例如,下面是组织层次结构:

VP Unit 1 VP Unit 2
Director Unit 1 Director Unit 2 Director HR
Department 1 Manager Department 2 Manager HR Manager
Department 1 Supervisor Department 2 Supervisor HR Associate
Department 1 Worker Department 2 Worker

工人和主管无权访问该系统。 HR 人员可以查看所有部门/业务单位的所有员工记录。部门经理可以查看并为自己部门的主管和工人创建记录。主管可以查看并为自己部门的经理、主管和员工创建记录。

我正在使用 Nextjs 和 AWS Amplify 编写应用程序,后者通过 AWS Cognito 提供身份验证。我希望能够在应用程序中创建员工/用户,然后分配一个部门和一个职位——可能是组,或者只是自定义属性。该部门似乎很容易在 graphql 模式中使用@auth,但对于这个职位,我想不出一种方法来使用组来只查看下一个级别。如果员工升职,则读取或创建员工档案记录的访问级别也应更改。此外,一旦应用程序投入生产,将不会有任何人从 AdminUI 维护它,因此所有功能都必须从应用程序的前端可用。

实现这一点的最佳方法是什么?

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-amplify


    【解决方案1】:

    我认为唯一的方法是在您的应用程序中找到一种方法,将 ownerField 数组或 a groupFieldArray 添加到您的项目中,并细化哪些 cognito 组或哪些用户可以访问 db 项目本身上的 db 中的每个项目。

    type Employee 
      @model
      @auth(rules: [
        { allow: owner, operations: [create, read, update, delete]},
        { allow: owner, ownerField: "usersThatCanRead", operations: [read] },
        { allow: groups, groupsField: "groupsThatCanRead", operations: [read] }
      ]) {
        id: ID!
        owner: String # the full owner of the db item
        usersThatCanRead: [String] #add cognitousersub to the item in this array
        groupsThatCanRead: [String] #add cognito usergroups to the item in this array
        name: String
        email: String
        phone: String
        etc: String
      }
    

    【讨论】: