>웹 프론트엔드 >View.js >Vue의 다양한 권한 제어 및 관리 구현 아이디어에 대한 자세한 설명

Vue의 다양한 권한 제어 및 관리 구현 아이디어에 대한 자세한 설명

藏色散人
藏色散人앞으로
2023-04-03 15:09:472893검색

이 글은 Vue에 대한 관련 지식을 주로 소개하며, Vue의 다양한 권한 제어 및 관리 구현 아이디어를 자세히 소개하고 있으니 관심 있는 친구들이 함께 살펴보시면 좋겠습니다.

Vue의 다양한 권한 제어 및 관리 구현 아이디어에 대한 자세한 설명

1. 메뉴 권한

  • 메뉴 권한: 사용자가 시스템에서 볼 수 있는 메뉴 항목을 제어합니다.
  • 메뉴 권한은 백그라운드 시스템의 왼쪽 메뉴 표시줄을 참조합니다. 백엔드 인터페이스 반환된 권한 데이터는 element-ui 메뉴 구성 요소를 사용하여 루프에 함께 연결할 수 있습니다. 메뉴는 권한에 따라 표시됩니다.
  • vuex+persistence 플러그인(로컬 저장소)을 사용하여 해결하세요. 페이지 새로고침 시 메뉴바가 표시되지 않는 문제
  • 로그아웃 기능 구현 시 clear() 메소드를 통해 로컬 데이터를 삭제하고, window.location을 통해 현재 페이지를 새로고침하세요. vuex 데이터를 삭제하기 위한 점프 후 reload()clear()方法清除本地数据,跳转后通过window.location.reload()刷新当前页面,可实现清除vuex数据的操作

二、 路由权限

  • 路由权限为了防止用户恶意通过在地址栏输入地址发生强行跳转,可以通过动态路由对用户权限做出相关限制,有权限则跳转,无权限则跳转404页面
  • 路由权限的方法需要在两个时机调用initDynamicRoutes,分别是登录成功时和页面创建时,否则动态路由为默认值,刷新无法访问
import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '@/layout'
import store from '@/store'

Vue.use(VueRouter)

// 动态路由规则
const tableRule = {
  path: '/table',
  name: 'table',
  component: () => import('@/views/table/index.vue')
}
const imageRule = {
  path: '/image',
  name: 'image',
  component: () => import('@/views/image')
}
const userRule = {
  path: '/users',
  name: 'users',
  component: () => import('@/views/users')
}

// 路由规则和字符串的映射关系
const ruleMapping = {
  table: tableRule,
  users: userRule,
  image: imageRule
}

//静态路由
const routes = [
  {
    path: '/login',
    // name: 'login', // 这里如果有name 控制台会提示
    component: () => import('@/views/login')
  },
  {
    path: '/',
    component: Layout,
    children: [
      {
        path: '',
        // name: 'home',
        component: () => import('@/views/home')
      },
      {
        path: '/chart',
        component: () => import('@/views/chart')
      }
    ]
  }
]

const router = new VueRouter({
  routes
})



//路由权限:用户登录后接口返回,存储到本地缓存
const rightList = [
  {
    id: 1,
    authName: "基本页面",
    icon: "el-icon-connection",
    children: [
      {
        id: 11,
        authName: "表格页面",
        icon: "el-icon-s-grid",
        path: "table",
        rights: ["view", "edit", "add", "delete"]
      },
      {
        id: 12,
        authName: "素材页面",
        icon: "el-icon-s-marketing",
        path: "image",
        rights: ["view", "edit", "add", "delete"]
      }
    ]
  },
  {
    id: 2,
    authName: "用户权限",
    icon: "el-icon-set-up",
    children: [
      {
        id: 21,
        authName: "权限页面",
        icon: "el-icon-s-custom",
        path: "users",
        rights: ["view", "edit", "add", "delete"]
      }
    ]
  }
];

//在登录(login.vue)、页面刷新(App.vue)的时候,调用initDynamicRoutes
export function initDynamicRoutes () {
  // 根据二级权限 对路由规则进行动态的添加
  const currentRoutes = router.options.routes
  rightList.forEach(item => { // 如果是没有子路由的话 就直接添加进去 如果有子路由的话就进入二级权限遍历
    if (item.path) {
      const temp = ruleMapping[item.path]
      // 路由规则中添加元数据meta
      temp.meta = item.rights
      currentRoutes[1].children.push(temp)
    }

    item.children.forEach(item => {
      // item 二级权限
      const temp = ruleMapping[item.path]
      // 路由规则中添加元数据meta,用于按钮权限控制
      temp.meta = item.rights
      currentRoutes[1].children.push(temp)
    })
  })
  // 添加路由规则
  router.addRoutes(currentRoutes)
}

export default router

三、 按钮权限

  • 所谓的按钮权限是指在某个菜单的界面中,我们需要根据后端返回的该角色当前操作模块中对应的按钮权限数据,展示出可进行操作的按钮,比如删除,修改,增加等按钮.
    1. 如果要实现按钮的权限控制,我们需要使用vue的自定义指令去实现: 首先需要创建一个按钮权限控制的指令,我们定义这个指令的名称为: v-permission
    1. 在这个指令的内部获取到当前用户的按钮权限(vuex|本地缓存中)数据
    1. 在通过binding.value获取到自定义制定属性值的数据
    1. 判断从vuex|本地缓存中获取到的按钮权限数据是否包含了自定义指令包含的权限
    1. 如果不包含,我们在设置el.style.display = “none”,或者使用el.parentNode.removeChild(el)删除当前 按钮元素
<el-button v-permission="[$route.path, &#39;add&#39;]">添加</el-button>
directives: {
        // 检测全选的指令
        permission: {
            // 绑定此指令的标签插入到dom节点触发
            inserted(el, bind) {
                // el:绑定该指令标签
                // bind:对象格式 当前绑定指令标签上的数据情况
                // 获取按钮上的value值,就是用户当前要使用的权限和请求的路由地址
                let value = bind.value//[&#39;/user&#39;,&#39;add&#39;]
                //模拟后端返回的当前角色对应的权限
                let rules = {
                    &#39;/menu&#39;: [&#39;add&#39;, &#39;edit&#39;],
                    "/user": [ &#39;edit&#39;, &#39;remove&#39;],
                    "/goods": [&#39;add&#39;]
                }
                // 根据访问的路由地址获取该模块的操作权限
                let allow = rules[value[0]]
                // 检测当前操作是否合法
                if (!allow.includes(value[1])) {
                    // 不合法隐藏操作按钮
                    el.style = "display:none"
                }
            }
        }
 }

四 、 数据权限

  • 数据权限
  • 2. 라우팅 권한

  • 라우팅 권한 사용자가 주소를 입력하여 악의적으로 강제로 점프하는 것을 방지하기 위해 주소 표시줄에서 동적 라우팅을 사용하여 사용자 권한을 제한할 수 있습니다. 권한이 부여된 경우 점프합니다. 권한이 없으면 404 페이지로 점프합니다.
  • 라우팅 권한 메서드는 initDynamicRoutes를 호출해야 합니다. > 두 번, 즉 로그인이 성공할 때와 페이지가 생성될 때. 그렇지 않으면 동적 경로가 기본값이 되며 새로 고쳐도 액세스할 수 없습니다. 3. 버튼 권한

소위 버튼 권한은 특정 메뉴의 인터페이스에서 백엔드에서 반환된 역할의 현재 작업 모듈에 대응해야 함을 의미합니다. 버튼 권한 데이터는 조작할 수 있는 버튼을 보여줍니다.


    버튼 권한 제어를 구현하려면 vue의 사용자 정의 지침을 사용해야 합니다. 먼저 버튼 권한 제어를 위한 명령을 만들어야 합니다. 이 명령의 이름을 다음과 같이 정의합니다: v-permission
🎜
    🎜이 명령 내에서 현재 사용자 가져오기 버튼 권한(vuex | 로컬 캐시) data 🎜
🎜🎜
    🎜bind.value🎜🎜🎜
      🎜Determine을 통해 사용자 정의 속성 값 데이터 얻기 vuex|local 캐시에서 얻은 버튼 권한 데이터에 사용자 지정 명령에 포함된 권한이 포함되어 있는지 여부🎜
    🎜🎜
      🎜포함되지 않은 경우 el.style.display = “none” 설정 또는 el.parentNode.removeChild(el) 사용 현재 버튼 요소 삭제🎜
    🎜🎜
    import axios from &#39;axios&#39;
    import router from &#39;@/router&#39;
    
    const request = axios.create()
    
    // 映射
    const actionMapping = {
      get: &#39;view&#39;,
      post: &#39;add&#39;,
      put: &#39;edit&#39;,
      delete: &#39;delete&#39;
    }
    
    // request.defaults.baseURL = &#39;http://127.0.0.1:7001&#39; // 注释掉之后调的接口将是Mock数据
    
    // 请求拦截器
    request.interceptors.request.use(req => {
      // console.log(req.url)
      // console.log(req.method)
      if (req.url !== &#39;/login&#39; && req.url !== &#39;/roles&#39;) {
        // 不是登录的请求 也不是获取权限的请求 则在请求头中加入token  不知道如何使用Mock来验证请求头中的token 故此处注释
        // req.headers.Authorization = sessionStorage.getItem(&#39;token&#39;)
        const action = actionMapping[req.method]
        // 判断非权限范围内的请求
        // console.log(router)
        const currentRight = router.currentRoute.meta
        // console.log(currentRight)
        if (currentRight && currentRight.indexOf(action) === -1) {
          // 没有权限
          alert(&#39;没有权限&#39;)
          return Promise.reject(new Error(&#39;没有权限&#39;))
        }
      }
      return req
    })
    
    
    export default request

    4. 데이터 권한🎜🎜🎜데이터 권한은 다른 역할을 가진 사용자가 보는 테이블 데이터입니다. 다릅니다🎜🎜예를 들어 Zhang San이 프로젝트 관리자인 경우 , 그는 특정 비즈니스 형식의 모든 데이터 및 필드 정보를 볼 수 있습니다🎜🎜Li Si는 일반 직원이며 테이블에서 자신의 데이터만 볼 수 있습니다🎜🎜코드 구현: 프런트 엔드가 에 있습니다. 요청 헤더가 균일하게 캡슐화됩니다. 마지막으로 백엔드는 사용자 권한을 감지하고 구문 분석하여 해당 데이터를 반환합니다. 🎜vue Video Tutorial🎜"🎜🎜🎜

위 내용은 Vue의 다양한 권한 제어 및 관리 구현 아이디어에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제