Как я могу определить способности с JSON, используя CASL - PullRequest
1 голос
/ 01 мая 2020

Я читал документацию по библиотеке CASL, и, очевидно, вы можете определить способности, используя JSON, примерно так:


import { Ability } from '@casl/ability';

export default new Ability([
  {
    action: 'read',
    subject: 'Post'
  },
  {
    action: 'delete',
    subject: 'Post',
    conditions: { published: true },
    inverted: true
  }
])

Но сейчас я пытаюсь сделать фиктивный пример, например это и не работает, не знаю почему:

import { Ability } from '@casl/ability';
const ability = new Ability([{ action: 'read', subject: 'article' }], {
    detectSubjectType:subject => subject.subject
})
console.log(ability.can('read', {subject: 'article'})); // Returns false

1 Ответ

0 голосов
/ 02 мая 2020

Начиная с 4.0, CASL поддерживает классы как предметы. Из-за этого detectSubjectType вызывается для каждого правила во время создания Ability, чтобы определить тип объекта.

В вашем случае функция обрабатывает только переданные объекты как объекты (с полем subject), но она также должна корректно работать со строками.

У вас есть 2 варианта:

  • проверить, является ли тема строкой, и если да, вернуть ее, поскольку
const ability = new Ability([{ action: 'read', subject: 'article' }], {
   detectSubjectType: subject => typeof subject === 'string' ? subject : subject.subject
})
  • use по умолчанию detectSubjectType как запасной вариант
import { Ability, detectSubjectType } from '@casl/ability';
const ability = new Ability([{ action: 'read', subject: 'article' }], {
   detectSubjectType: subject => subject && subject.subject ? subject.subject : detectSubjectType(subject)
})

В разделе Обнаружение пользовательского типа объекта , в документах говорится:

Пользовательская функция обнаружения должна возвращать string и обрабатывать следующие случаи:

  • , когда subject равно undefined
  • , когда subject равно string или function (это следует воспринимать как субъект введите)
  • , когда субъект является object

Если вы не хотите обрабатывать все эти случаи, вы можете вернуться к встроенной функции detectSubjectType, которая будет делать это для тебя.

...