#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 этот параметр является обязательным. Таким образом, эта путаница исчезнет очень скоро