Проблема с 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

Я предполагаю, что дело в самом хранилище, но никак не могу додуматься где косяк.


Ответы (0 шт):