Авторизация на основе разрешений на объект Hasura

Я пытаюсь установить разрешения «Выбор строки» для Хасуры. У меня есть (упрощенная для краткости) модель данных, как показано ниже

Пользователь

      id: UserID

Приложение

      id: AppID

Разрешения приложения

      user_id: User ID
app_id: App ID
permissions: [ ENUM: Admin, View, Owner ]

Кормить

      app_id: AppID
feed_data: Some Feed Data

Теперь я хочу запросить весь канал для аутентифицированного пользователя. Запрос может иметь форму

  • ПОЛУЧИТЬ все приложения, для которых аутентифицированный пользователь имеет разрешения на просмотр
      query MyQuery {
  feed(limit: 10) {
    app_id
    feed_data
  }
}
  • ПОЛУЧИТЬ приложения с в фильтре запросов, для которых аутентифицированный пользователь имеет разрешения на просмотр
      query MyQuery {
  feed(limit: 10, where: {app_id: {_in: [1, 2]}}) {
    app_id
    feed_data
  }
}

Поскольку в таблице нет user_id информация прямо в нем, я не могу использовать X-Hasura-User-Id приписывать прямо против feedТаблица. Я также пробовал использовать _exists отношение к app_permission таблица, но я не могу поставить app_id фильтр в разрешении.

      {
  "_exists": {
    "_where": {
      "user_id": {
        "_eq": "X-Hasura-User-Id"
      }
    },
    "_table": {
      "schema": "public",
      "name": "app_permission"
    }
  }
}

Я не совсем уверен, как продолжить такое моделирование данных с помощью Hasura. Любая помощь приветствуется. Спасибо.

2 ответа

Еще одна вещь, которую я хотел бы предложить, - это то, что вы можете попробовать использовать переменную сеанса, например x-hasura-app-id вдоль x-hasura-role и создавайте свои разрешения вокруг этого.

https://hasura.io/docs/latest/graphql/core/auth/authorization/roles-variables.html

Поскольку у вас нет прямого отношения, я думаю, вы можете запрашивать через appPermissions Table вместо прямого запроса таблицы каналов.

Когда вы создаете feedsтаблица с appId в качестве отношения внешнего ключа, Hasura позволяет отслеживать эту взаимосвязь, как показано ниже. Таким образом, вы можете делать вложенные запросы graphQL к таблице appPerms, как показано ниже

      query GetUserFeeds {
  test_appPerms {
    id
    userId
    feeds(limit: 10) {
      app_id
      id
      feed_data
    }
  }
}

Другие вопросы по тегам