Как применить разрешения для всех таблиц? - PullRequest
0 голосов
/ 05 августа 2020

Мой сценарий очень прост. Две пользовательские роли: один администратор и один наблюдатель. Средство просмотра может видеть данные только для чтения. Можно ли как-то установить это, не указывая вручную разрешения на выбор для каждой отдельной таблицы? Кажется, такая распространенная проблема, но я ничего не могу найти в документации.

1 Ответ

3 голосов
/ 06 августа 2020

К сожалению, не существует метода API для изменения разрешений (или других метаданных) для каждой таблицы сразу. Для этого требуется имя таблицы и схема.

Я не уверен, во что переводится ваше разрешение «только для чтения», но вы можете сделать это двумя способами:

  1. Вызовите API метаданных с create_select_permission для каждого имени таблицы, программно
POST /v1/query HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin

{
    "type" : "create_select_permission",
    "args" : {
        "table" : "article",
        "role" : "user",
        "permission" : {
            "columns" : "*",
            "filter" : {
                "author_id":{ "_eq": "X-Hasura-User-Id" }
             },
             "limit": 100,
             "allow_aggregations": false
        }
    }
}
Используйте Metadata SDK для программного создания tables.yaml или metadata.json с обновленными разрешениями выбора для каждой таблицы, а затем примените метаданные

См. https://github.com/hasura/graphql-engine/issues/5459

import { Convert } from './customMetadataConverter'
import { TableEntry } from '../generated/HasuraMetadataV2'

// Read "tables.yaml" file as text from filesystem
const tablesMetadataFile = fs.readFileSync('./metadata/tables.yaml', 'utf8')
// Convert it to JSON object with type annotation using loadYAML utility
const tablesMetadata: TableEntry[] = Convert.loadYAML(tablesMetadataFile)

for (let table of tablesMetadata) {
  if (table.insert_permissions.length == 0) table.insert_permissions = []
  // Put the permission you want applied on every table here
  table.insert_permissions.push({
     columns : "*",
     filter : { user_id: { _eq: "X-Hasura-User-Id" } },
     limit: 100,
     allow_aggregations: false
  })
}
// Ouput the updated "tables.yaml" to filesystem
fs.writeFileSync('./tables-updated.yaml', Convert.metadataToYAML(tablesMetadata))
...