Проблема с CASL vue
import { createMongoAbility, AbilityBuilder } from '@casl/ability';
type Actions = 'create' | 'read' | 'update' | 'delete';
type Subjects = 'User' | 'Group' | 'Role' | 'Form' | 'Ticket';
export function defineRulesFor(user: any) {
const { can, build } = new AbilityBuilder(createMongoAbility);
user.Groups.forEach((group: any) => {
group.Roles.forEach((role: any) => {
role.RoleGroups.forEach((roleGroup: any) => {
const action = roleGroup.permission as Actions;
const subject = role.name as Subjects;
can(action, subject);
});
});
});
return build();
}
import { storeToRefs } from 'pinia'
import { useAbilityStore } from '@/store/ability'
import { useAbility as useCan } from '@casl/vue';
const { can } = useCan();
export function useAbility() {
const abilityStore = useAbilityStore()
const { ability } = storeToRefs(abilityStore)
return {
ability,
can: (action: string, subject: string) => can(action, subject)
}
}
import { defineStore } from 'pinia'
import { createMongoAbility } from '@casl/ability'
import { defineRulesFor } from '@/services/ability'
export const useAbilityStore = defineStore('ability', {
state: () => ({
ability: createMongoAbility()
}),
actions: {
setAbility(user: any) {
this.ability = defineRulesFor(user)
},
can(action: string, subject: string) {
return this.ability.can(action, subject)
}
}
})
у меня есть проблема с этим хранилищем. Когда я вызываю функцию abilityStore.can('read', 'Form'), то он проверяет значения некорректно. Так как если есть хотя бы одно действие для 'Form', то он возвращает true, даже если действия не совпадают. К примеру у меня есть права только на create Form, но проверка из примера выше выдаст true
Я предполагаю, что дело в самом хранилище, но никак не могу додуматься где косяк.