首页 > 其他分享 >[权限]基于角色+权限配置模式

[权限]基于角色+权限配置模式

时间:2023-04-09 16:46:18浏览次数:47  
标签:基于 name 角色 permission totalPermission directives import 权限 store

基于角色+权限配置模式

可以将权限粒度设置的更细致一些。
具体参考

  • 前端:登录成功后,再获取权限列表,在页面上进行权限判断。
  • 后端:不变

登录

当用户登录时,将用户角色写入到vuex,保存当前用户角色信息。

  • vuex中
import {createStore} from 'vuex'

export default createStore({
    state: {
        token: localStorage.getItem('token') || '',
        role: localStorage.getItem('role') || '',
        permission: localStorage.getItem('permission') || ''
    },
    getters: {},
    mutations: {
        login(state, {token, role, permission}) {
            state.token = token
            state.role = role
            state.permission = permission
            localStorage.setItem('token', token)
            localStorage.setItem('role', role)
            localStorage.setItem('permission', permission)
        }
    },
    actions: {},
    modules: {}
})
  • 登陆方法
const handleFinish = () => {
  const login_info = {
    token: '123',
    role: formState.role,
    permission: {
      'admin': {
        'department-list': ['get', 'post'],
        'department-detail': ['get', 'delete', 'put', 'patch']
      },
      'user': {
        'department-list': ['get'],
        'department-detail': ['get']
      }
    }
  }
  store.commit('login', login_info)
  message.info(formState.user + "登陆成功")
  router.replace({name: "admin"})
};

定义路由(不变)

定义路由时,基于 meta 来指定哪些角色的用户可以访问此路由。

路由导航守卫(不变)

用户访问页面时,在导航守卫中,进行判断,是否有权访问此路由。

  • 有权,继续访问
  • 无权,跳转登录页面

2.4 菜单的加载(不变)

根据vuex中的角色,加载自己的路由,并添加在菜单中。

2.5 按钮控制&权限判断

<template>
    <h1>用户管理</h1>
    <div>
        <ul>
            <li v-if='hasPermission("user", "get")'>查看</li>
            <li v-if='hasPermission("user", "post")'>新增</li>
            <li v-if='hasPermission("user", "put")'>修改</li>
            <li v-if='hasPermission("user", "delete")'>删除</li>

            <li v-permission="['user','post']">休息休息</li>

        </ul>
    </div>
</template>

<script setup>
import {hasPermission} from "@/store/permission";

</script>

<style scoped>

</style>
  • directives/permission.js

    import store from "@/store";
    
    
    
    export default {
        mounted(el, bindings) {
            let [name, method] = bindings.value;
            //console.log(name, method);
            let totalPermission = store.getters.totalPermission;
            if(!totalPermission[name]){
                el.parentNode && el.parentNode.removeChild(el);
            }
            if(totalPermission[name].indexOf(method) === -1){
                el.parentNode && el.parentNode.removeChild(el);
            }
        }
    }
    
    
  • directives/index.js

    import permission from "./permission"
    //批量注册指令(现在就一个permission)
    const directives = {
        permission
    }
    //注册的一般写法,循环遍历directives,通过vue.directive注册
    export default {
        install(Vue) {
            Object.keys(directives).forEach(key => {
                Vue.directive(key, directives[key])
            })
        }
    }
    
  • main.js

    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router'
    import store from './store'
    import directives from "@/directives";
    
    createApp(App).use(store).use(router).use(directives).mount('#app')
    
  • store/permisson.js

    import store from "@/store";
    
    export function hasPermission(name,method) {
        console.log(store.getters.totalPermission);
        console.log(name,method);
        let totalPermission = store.getters.totalPermission;
        if(!totalPermission[name]){
            return false;
        }
        if(totalPermission[name].indexOf(method) !== -1){
            return true;
        }
        return false;
    }
    
    

标签:基于,name,角色,permission,totalPermission,directives,import,权限,store
From: https://www.cnblogs.com/sherwin1995/p/17300532.html

相关文章

  • 基于AutomationML的多模型数字孪生驱动方法
    【场景】:终于要毕业了,从一开始都不知道数字孪生是什么,在没有老师和师兄师姐铺路的情况下,一点点看论文,复现论文,找创新点,真的太苦了。这里将我这三年在数字孪生的研究简单记录、分享一下,希望能帮到某些人,水平有限,不喜勿喷。我所了解到的,现有数字孪生的主流实现方法大......
  • 小故事:开发者对Android权限的看法
    Wei:投诉一下,App的log.txt放在系统根目录下,这比较过分某L:原来还没改过来……去年就反映过这个问题了。Wei:升级App后,我向其他人发短信,腾讯手机管家报App要读取短信。为什么要监听发短信?可能应为某些功能,要监听来自某号的特殊短信,但为何要监听发送短信?某登:那个流量与内容监控的项目,是......
  • android沉浸状态栏+导航栏(小白条) 小白教程 (基于安卓官方教程)
    沉浸状态栏+导航栏(小白条)是基本操作,但是网上的很多教程都是错误的...,安卓官方的教程对小白很不友好,所以记录下我的实现过程供大家参考。前置知识状态栏是屏幕顶部显示时间、通知图标等等的地方导航栏就是屏幕下方用于提供返回,返回桌面,进入多任务界面的的三个按键或着小白条......
  • TiDB 数据库大版本升级-基于TiCDC异机升级
    作者:gary一、前言 本操作手册描述了xx用户TiDB集群基于TiCDC进行大版本升级的操作过程、操作方法与注意事项,用于指导xx用户完成TiDB集群基于TiCDC进行大版本异机升级以及回退方案。 二、升级架构图 ** **TiCDC的系统架构如上图所示:部署一套所需升级版本的下游TiDB集群......
  • 基于TiDB+Flink实现的滑动窗口实时累计指标算法
    作者:Jellybean前言在不少的支付分析场景里,大部分累计值指标可以通过T+n的方式计算得到。随着行业大环境由增量市场转为存量市场,产品的运营要求更加精细化、更快速反应,这对各项数据指标的实时性要求已经越来越高。产品如果能实时把握应用的整体运行情况或特征用户的状态,就可......
  • 基于TiDB Binlog架构的主备集群部署及数据同步操作手册
    作者:Liuhaoao最近手头有个系统,有需要搭建灾备库的需求(rto要求4小时内,根据实际情况计算)。考虑到生产系统是5版本,TiCDC存在一些兼容性问题,且TiDBBinlog已经有实践案例及经验可供参考,故选择使用TiDBBinlog来实现主集群-->灾备集群的增量数据同步。数据全量初始化采用Dumpling+Ti......
  • 基于蛙跳算法的最优值计算matlab仿真
    1.算法描述            蛙跳算法是基于种群进化的元启发式算法之一,通过模拟自然界中青蛙觅食过程中种群所体现出的交流与合作行为,以实现对问题的求解。在一片湿地中,分布着一群青蛙,每只青蛙有自己的想法,每只青蛙的想法则被定义为一个解。每只青蛙找到食物时,都会......
  • 基于FPGA的AES加密解密vivado仿真,verilog开发,包含testbench
    1.算法描述         AES,高级加密标准,是采用区块加密的一种标准,又称Rijndael加密法.严格上来讲,AES和Rijndael又不是完全一样,AES的区块长度固定为128比特,秘钥长度可以是128,192或者256.Rijndael加密法可以支持更大范围的区块和密钥长度,Rijndael使用的密......
  • 【图像检测】基于DCT和arnold实现水印篡改检测附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • [权限]基于角色的静态模式
    绝大多数,用户角色和功能固定时,推荐在这种方式。开发简单,工作量少,可以快速交付。1.登录当用户登录时,将用户角色写入到vuex,保存当前用户角色信息。#store/index.jsimport{createStore}from'vuex'exportdefaultcreateStore({state:{token:localStorag......