首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Casl/vue $can函数返回false,但用户拥有该权限

Casl/vue $can函数返回false,但用户拥有该权限
EN

Stack Overflow用户
提问于 2021-03-08 09:16:12
回答 1查看 1.8K关注 0票数 2

在vue cli项目中,我使用@ casl /vue插件进行用户权限管理,如casl插件作者示例(vue-blog)在本示例repo中所示。这是我的密码

ability.js

代码语言:javascript
复制
export default (store) => {
const ability = store.getters.ability
ability.update(store.state.rules);
return store.subscribe((mutation) => {
    switch (mutation.type) {
        case 'ROOT_LOGIN_SUCCESS':
            var formattedRules = [];
            if (mutation.payload.permissions.length > 0) {
                formattedRules = mutation.payload.permissions.map(perm => {
                    let formattedObj = {};
                    formattedObj.actions = perm.substr(0, perm.indexOf(' '));
                    formattedObj.subject = perm.substr(perm.indexOf(' ') + 1);
                    return formattedObj;
                })
            }
            console.log(formattedRules)
            ability.update(formattedRules);
            break
        case 'ROOT_LOGOUT_SUCCESS':
            ability.update([{actions: 'read', subject: 'all'}])
            break
    }
 })
}

在登录和格式化时,我将从rest获取rules,并将其保存为casl/vue格式的localStorage格式{actions: 'someAction', subject: 'someSubject'}。这是

storage.js

代码语言:javascript
复制
export default (options) => (store) => {
 if (localStorage.state) {
    const storedState = JSON.parse(localStorage.state)
    store.replaceState(Object.assign(store.state, storedState))
 }
 return store.subscribe((mutation, state) => {
    if (options.destroyOn && options.destroyOn.indexOf(mutation.type) !== -1) {
        return localStorage.removeItem('state')
    }
    const newState = options.storedKeys.reduce((map, key) => {
        map[key] = state[key]
        return map
    }, {});
    localStorage.state = JSON.stringify(newState)
 })
}

和store.js

代码语言:javascript
复制
/*
 * FOR USER PERMISSIONS MANAGEMENT ON UI */
 import {Ability} from '@casl/ability'
 import abilityPlugin from "@/shared/store/ability"
 import storage from "@/shared/store/storage";
 ...
 export default new Vuex.Store({
    plugins: [
      storage({
        storedKeys: ['token', 'rules'],
        destroyOn: ['ROOT_LOGOUT_SUCCESS']
      }),
      abilityPlugin
    ],
 ...
 mutations: {
    ROOT_LOGIN_SUCCESS(state, data) {
        let formattedRules = [];
        if (data.permissions.length > 0) {
            formattedRules = data.permissions.map(perm => {
                let formattedObj = {};
                formattedObj.actions = perm.substr(0, perm.indexOf(' '));
                formattedObj.subject = perm.substr(perm.indexOf(' ') + 1);
                return formattedObj;
            })
        }
        state.rules = formattedRules;
        state.token = data.token;
    },
    ROOT_LOGOUT_SUCCESS(state) {
        state.rules = [];
    },
 },
 ...
 getters: {
     ability() {
         return new Ability()
     }
  },
}

main.js

代码语言:javascript
复制
/*
* FOR USER PERMISSIONS MANAGEMENT ON UI */
 import {abilitiesPlugin, Can} from '@casl/vue'
 Vue.use(abilitiesPlugin, store.getters.ability)
 Vue.component('Can', Can);

在Vue组件模板中,我使用它的方式如下

index.vue

代码语言:javascript
复制
          <v-btn
            v-if="$can('delete', 'department')"
            color="error"
            dark
            @click="uiShowConfirm({content: 'Are you sure?', 
                     callBack: deleteConfirmed})"
        >
            <v-icon class="mr-2">mdi-delete</v-icon>
            Delete
        </v-btn>

但是它正在返回false

一些帮助是非常感谢的!

我这样救了rules

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 13:36:39

我用的是@casl/ability@5.2.2@casl/vue@1.2.2

正如@SergiiStotskyi的评论中所说的

如果relevantRuleFor为null,这意味着casl并不是提供的操作/主题对的规则。据我所知,rule对象的形状是错误的。操作在v4中被废弃,在v5中被删除。尝试用actions替换action

在将actions更改为action之后就可以工作了。

谢谢@SergiiStotskyi

Casl是一个很好的图书馆。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66527075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档