如何在Vue定制中间件中获取Vuex更新的getters值以进行权限检查?

问题描述 投票:1回答:1

我已在登录并更新getter后加载侧栏时加载了所有权限。我可以从侧边栏组件访问所有权限。现在,我想访问中间件中的所有权限。可能吗?该怎么办?请提出建议。

这是我的权限存储:

const state = {
    permissions: [],
    user: [],
  }
  const getters = {
    getPermissions: state => state.permissions,
    getUserInfo: state => state.user,
  }
  const actions = {
      userPermission({commit}, data) {          
        if (data != null) {
            axios.get("/api/auth/user", {params: { token: data.token}})
            .then(res => {
                const per = res.data.data.permissions;                
                commit("setPermissions", per);
                // console.log(res.data.data.permissions);
            })
            .catch(err => {
                console.log(err);            
            });
        }
      },
      userInfo({commit}, data) {          
        if (data != null) {
            axios.get("/api/auth/user", {params: { token: data.token}})
            .then(res => {
                const info = res.data.data.user;                
                commit("setUserInfo", info);
                // console.log(res.data.data.user);
            })
            .catch(err => {
                console.log(err);            
            });
        }
      },
  } 
  const mutations = {
    setPermissions(state, data) {
        state.permissions = data;
    },
    setUserInfo(state, data) {
        state.user = data;
    }
  }
  export default {
    state,
    getters,
    actions,
    mutations
  }

这里是中间件功能:

import store from '../store';
export default (to, from, next) => {
    if (isAuthenticated()) {        
        if (!hasPermissionsNeeded(to)) {
            next('admin/permission-denied');
        } else {
            next();
        }
        next();
    } else {
        next('/admin/session/login');
    }
};
function isAuthenticated() {
    if (localStorage.getItem("userInfo") != null && localStorage.getItem("userInfo").length > 0) {
        return true;
    } else {
        localStorage.removeItem("userInfo");
        return false;
    }
};
function hasPermissionsNeeded(to) {
    var permissions = store.getters.getPermissions;
    if(permissions.includes(to.meta.permissions) || to.meta.permissions == '*') {
        return true;
    } else {
        return false;
    }
};

这是路由器逻辑:

path: "/admin/country",
    component: () => import("./views/admin/country/country"),
    beforeEnter: authenticate,
    meta : {
      permissions: 'browse country'
    }
vue.js vuex vue-router user-permissions
1个回答
0
投票

我看不到您要在何处分派userPermission操作以加载权限,但是我假设您只是将其分派到仅在中间件运行后才被调用的地方。因此,看起来好像在运行中间件时尚未加载权限。您可能要在中间件中分发权限,等待它完成,然后再检查权限。例如:

export default (to, from, next) => {
    store.dispatch('userPermission').then(() => {
        if (isAuthenticated()) {
        ...
    })
© www.soinside.com 2019 - 2024. All rights reserved.