Получение правильных разрешенных полей условий

#casl

#casl

Вопрос:

В настоящее время я создаю приложение, следуя аналогичной логике:

 ...
const user = {
  isAdmin: true,
  company: '5faa6a847b42bf47b8f785a1',
  projects: ['5faa6a847b42bf47b8f785a2']
}

function defineAbilityForUser(user) {
  return defineAbility((can) => {
    if (user.isAdmin) {
      can('create', 'ProjectTime', {
          company: user.company,
        }
      );
    }
    
    can(
      'create', 
      'ProjectTime', 
      ["company", "project", "user", "start", "end"], 
      {
        company: user.company,
        project: {
          $in: user.projects
        }
      }
    );
  });
}

const userAbility = defineAbilityForUser(user); //
console.log( permittedFieldsOf(userAbility, 'create', 'ProjectTime') );

// console output: ['company', 'project', 'user', 'start', 'end']
  

В принципе admin , должно быть разрешено создавать время проекта без ограничений по полям.
И none admin пользователю должно быть разрешено устанавливать указанные поля только для проектов, к которым он принадлежит.

Проблема в том, что я ожидал бы получить [] в качестве выходных данных, потому что an admin должно быть разрешено устанавливать все поля для времени проекта.

Единственным решением, которое я нашел, было установить все поля в admin пользовательском условии. Но это требует много работы по миграции позже, когда новые поля будут добавлены в модель времени проекта. (также перенос второго условия в блок else в моем случае невозможен)

Есть ли другой лучший способ сделать это? Или, может быть, было бы лучше, если permittedFieldsOf бы функция -function определяла приоритетность условия без ограничений по полю?

Ответ №1:

На самом деле для casl нет способа узнать, что означает все поля в контексте ваших моделей. Он почти ничего не знает об их формах и полагается на условия, которые вы предоставляете, чтобы проверить эти объекты позже. Таким образом, он не содержит полной информации.

Что вам нужно сделать, так это передать 4-й аргумент для переопределения fieldsFrom обратного вызова. Проверьте документы api и справочную реализацию в @casl /mongoose

В casl v5 этот параметр является обязательным. Таким образом, эта путаница исчезнет очень скоро