0

我有一个组件,如果用户有权限,我想显示它,但 Can 组件似乎隐藏了该组件,而不管用户权限如何。

以下是我的ability.js 模块

import {Ability, AbilityBuilder} from "@casl/ability";

export default function defineAbilityFor(hasRole) {
    const { can, cannot, build } = new AbilityBuilder(Ability)
    if (hasRole !== undefined) {
        console.log(hasRole)
        can('manage', 'all')
        can('create', 'all')
    } else {
        can('read', 'all')
        cannot('create', 'all')
    }

    return build()
}

我将城堡添加为我的 main.js,如下所示:

const app = createApp(App)
app.use(router)
app.use(store)
app.use(abilitiesPlugin, ability(), {
    useGlobalProperties: true
})
app.component(Can.name, Can)
app.mount('#app')

以下是我需要进行权限检查的组件。

<template>
  <div class="d-flex flex-column px-4">
    <div class="d-flex justify-content-end">
      <Can I="create" an="Institution">
        <button class="btn btn-sm btn-outline-success" @click="addInst = true">{{ action }}</button>
      </Can>
    </div>
    <ListInstitutions v-if="addInst === false"/>
    <Can I="create" an="Institution">
      <AddInstitution v-if="addInst === true" @created="closeModal"/>
    </Can>
  </div>
</template>

<script>
import AddInstitution from "@/components/institution/AddInstitution";
import ListInstitutions from "@/components/institution/ListInstitutions";
import { Can } from "@casl/vue";

export default {
  name: 'InstitutionPage',
  components: {AddInstitution, ListInstitutions, Can},
  data() {
    return {
      addInst: false,
      action: this.addInst ? 'Institutions' : 'Add Institution'
    }
  },
  methods: {
    closeModal() {
      this.addInst = false
    }
  }
}
</script>

4

1 回答 1

0

非常感谢@Sergii Stotskyi。

我最终在definedAbility.js 文件中定义了能力,如下所示:

import { AbilityBuilder, Ability } from "@casl/ability";

export default function defineAbilityFor(userRole) {
  const { can, cannot, build } = new AbilityBuilder(Ability);

  if (userRole === 'user') {
    can ('read', 'Institution')
    cannot(['create', 'update'], 'all')
  }

  if (userRole === 'reg_admin_stroke' || userRole === 'admin') {
    can('manage', 'all')
  }

  return build()
}

然后在需要能力的每个组件中,在 setup() 方法中,我按如下方式创建能力:

...
import definedAbility from '@/services/definedAbility.js'

...
const ability = definedAbility(userRole.value)

return {
  ability
}

在我的模板中做了类似的事情:

<div v-if="ability.can('create', 'Institution')">
   <button class="btn btn-sm btn-outline-success"                           @click="addInst = true">{{ action }}</button>
</div>

于 2021-05-24T08:28:59.873 回答