Авторизация на основе разрешений на объект 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
}
}
}