ABA C Разрешения не работают одинаково для чтения и записи - PullRequest
1 голос
/ 14 января 2020

В настоящее время я проверяю FaunaDB, создающую пример приложения для отслеживания целей (todo!). Используя graphQL, я создал схему как:

type Goal {
  title: String!
  completed: Boolean!
  owner: User!
}

type User {
  name: String!
  username: String! @unique
}

input GoalInput {
  title: String!
  completed: Boolean!
}

Я хотел бы установить права доступа ABA C как:

  1. Зарегистрированные пользователи могут просматривать цели, созданные ими самими. .
  2. Зарегистрированный пользователь может редактировать только созданные им цели.

Разрешения для роли установлены следующим образом:

{
   resource: Collection("Goal"),
   actions: {
     read: Query(
       Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
     ),
     write: Query(
       Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
     )
   }
}

В то время как часть read хорошо работает, часть write, не так много. updateGoal (мутация, которая автоматически создается FaunaDB) продолжает выдавать ошибку недостаточных прав доступа.

1 Ответ

1 голос
/ 20 февраля 2020

Просто загрузите предоставленную вами схему, вот сгенерированное GoalInput:

input GoalInput {
  title: String!
  completed: Boolean!
}

Если вы не можете создавать новые цели с помощью поля owner, тогда вы не можете запросить их - owner будет be null

Попробуйте обновить схему, включив в нее поле целей для пользователя, чтобы получить искомое отношение «один ко многим». ( fauna docs )

type User {
  name: String!
  username: String! @unique
  goals: [Goal] @relation
}

Затем убедитесь, что каждый раз, когда вы создаете новую цель, вы устанавливаете владельца на себя.

Альтернатива с использованием функций

Вы можете создать пользовательскую мутацию для createGoalForMe, которая автоматически установит для вас поле владельца.

Убедитесь, что вы предоставили call привилегии для новой функции.

Проверка разрешений

Лямбда разрешения на запись получает в качестве аргументов как newData, так и oldData.

/*...*/
{
  resource: Collection("Goal"),
  actions: {
    /*...*/
    write: Query(
      Lambda(
        ["oldData", "newData"],
        And(
          Equals(Identity(), Select(["data", "owner"], Var("oldData"))),
          Equals(
            Select(["data", "owner"], Var("oldData")),
            Select(["data", "owner"], Var("newData"))
          )
        )
      )
    )
  },
  /*...*/
}
/*...*/

Поэтому измените "goalRef" на ["oldData", "newData"], и я думаю, что оно должно быть у вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...