Интеграция Casl с Featherjs-Sequelize

Я пытаюсь настроить роли и разрешения для обработки запросов API. Я использую Feathers.js с перьями-sequelize для базы данных PostGres.

Для управления ролями и разрешениями я использую casl.js: https://github.com/stalniy/casl

Большинство примеров для интеграции Casl основаны на mongo/mongoose. Я прочитал следующую статью после: https://stalniy.github.io/casl/abilities/database/integration/2017/07/22/database-integration.html

В приведенном примере они используют области продолжения, на данный момент перья-секвенирование не поддерживает области действия продолжения с параметрами (насколько я вижу)

Короче говоря, я пытаюсь найти способ интеграции перьев-sequelize с Casl для управления разрешениями на ресурсы.

До сих пор я мог создавать «способности» Casl для каждого пользователя, но теперь я застрял в подключении этих способностей к базе данных.

При использовании Mongo/mongoose это просто, так как вы просто делаете toMongoQuery и передаете параметры.

Если есть что-то, что мне нужно добавить, пожалуйста, дайте мне знать, не знаю, как получить помощь по этому конкретному вопросу.

С уважением, Эмир


person eGlu    schedule 19.07.2018    source источник


Ответы (2)


Вы можете использовать params.sequelize или params.query + toSequelizeQuery функция.

Посмотрите пример CASL Feathers, чтобы увидеть, как я сделал это для feathers-mongoose

person Sergii Stotskyi    schedule 20.07.2018
comment
@Сергил Спасибо за ответ. Я просмотрел пример CASL Feathers, строка, которую я пытаюсь понять для Sequelize: const query = toMongoQuery(ability, serviceName, action) Я вижу, вы упоминаете: params.sequelize & params.query + toSequelizeQuery. Не могли бы вы уточнить, как я могу их использовать? Я пытался следовать примеру: stalniy.github.io/casl/abilities/database/integration/2017/07/, но столкнулся с несколькими препятствиями. Спасибо еще раз. - person eGlu; 20.07.2018
comment
имеет ли это смысл на данный момент, замените строку: const query = toMongoQuery(ability, serviceName, action) на const query = toSequelizeQuery(ability, 'roles'); Тогда куда мне включить часть params.query? - person eGlu; 20.07.2018
comment
Да. Можешь попробовать. Я считаю, что это должно хотя бы частично сработать. Если у вас есть проект/пример на github, я могу его проверить - person Sergii Stotskyi; 20.07.2018

Так удалось решить проблему: я скопировал этот код: https://github.com/stalniy/casl-feathersjs-example/blob/master/src/hooks/abilities.js

Затем я адаптировал его, добавив следующую функцию:

function ruleToQuery(rule) {
  if (JSON.stringify(rule.conditions).includes('"$all":')) {
    throw new Error('Sequelize does not support "$all" operator')
  }
  return rule.inverted ? { $not: rule.conditions } : rule.conditions
}

Затем я заменил эту строку:

const query = toMongoQuery(ability, serviceName, action)

с

const query = rulesToQuery(ability, action, serviceName, ruleToQuery)

После импорта

const { rulesToQuery } = require('@casl/ability/extra');

Одной из моих проблем было то, как я создавал свои разрешения, которые не имеют прямого отношения ни к Feathers, ни к CASL.

Если у вас есть аналогичная проблема, но ответ выше не ясен, пожалуйста, прокомментируйте.

person eGlu    schedule 20.07.2018