Cuando no proporciona ninguna regla para un tema dado en CASL , verificar una habilidad para este tema siempre devuelve falso.
P.ej
import { Ability } from '@casl/ability'; const ability = new Ability({ action: "read", subject: "FirstSubject", // no rule for SecondSubject }); ability.can("read", "FirstSubject"); // true ability.can("write", "FirstSubject"); // false ability.can("read", "SecondSubject"); // false <-- These two lines should ability.can("write", "SecondSubject"); // false <-- return `true` ¿Es posible cambiar este comportamiento de manera que la habilidad se vuelva true para los sujetos que no tienen reglas?
En mi caso de uso, tengo una gran cantidad de temas y se pueden agregar nuevos dinámicamente. Sería difícil tener que agregar siempre { action: "manage", subject: "NewSubject"} cada vez que se agrega un nuevo tema. Preferiría agregar reglas solo para temas en los que algo está realmente restringido.
Según un chat con el autor de CASL, no es posible lograr esto.
aquí hay una manera de hacer eso:
import {Ability} from '@casl/ability'; class AppAbility extends Ability { relevantRuleFor (action, subject, field, allowNotDefinedRule) { const rule = super.relevantRuleFor(action, subject, field); if (!rule && allowNotDefinedRule) { return {inverted: false}; } return rule; } } export const ability = new AppAbility([]);Entonces puedes usarlo así:
ability.can('read', 'Post', undefined, true);Tenga en cuenta que su componente no funcionará correctamente porque en los sortes tiene este código que tiene un modificador privado:
private _canRender () { const props = this.props; const subject = props.of || props.a || props.an || props.this || props.on; const can = props.not ? 'cannot' : 'can'; return props.ability[can](props.I || props.do, subject, props.field); }En ese caso, debe crear su propio componente.