vue 사용자 정의 명령 과 동적 경로 구현 권한 제어
전단 공 사 는 Github 오픈 소스 프로젝트
Vue-element-admin를 템 플 릿 으로 하고 이 프로젝트 의 주 소 는Github | Vue-element-admin입 니 다.Vue-element-admin 템 플 릿 프로젝트 의 src/permission.js 파일 에서 경로 가 지 키 고 동적 경 로 를 불 러 오 는 실현 방안 을 제시 하여 서로 다른 캐릭터 를 바탕 으로 동적 경 로 를 불 러 오 는 기능 을 실현 합 니 다.우 리 는 조금 만 바 꾸 면 캐릭터 로드 루트 를 권한 로드 루트 로 바 꿀 수 있다.
내 비게 이 션 수위:경로 가 바 뀔 때 사용자 의 로그 인 상태 나 권한 을 판단 하 는 데 사용 할 수 있 습 니 다.프로젝트 중 전역 전치 수 비 를 사용 합 니 다.Vue 공식 문서 참조:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html
백 엔 드 리 턴 인터페이스
 권한 시스템 배경 은 역할 기반 권한 제어 방안
role-based access control을 사용 합 니 다.위의 그림 과 같 습 니 다.이 사용자 정보 인 터 페 이 스 는 사용자 가 가지 고 있 는 모든 역할 을 조회 하고 이 캐릭터 들 의 권한 을 경로-조작 에 따라 통합 하여 되 돌려 줍 니 다.사용자 가 시스템 에 로그 인 한 후에 저 희 는 배경 에서 사용자 정보(개인 정보+권한 정보)를 요청 하여 전체 속성 으로 전단 에 저장 합 니 다.서로 다른 권한 을 가 진 사용자 가 보 는 페이지 가 다 르 고 이러한 속성 에 의존 하 며 경로 가 어떻게 불 러 오 는 지,페이지 가 어떻게 렌 더 링 하 는 지 결정 합 니 다.
이러한 여러 구성 요 소 는 하나의 속성 에 의존 하 는 장면 으로 Vue 는
VueX을 전체 상태 관리 방안 으로 제공 합 니 다.VueX 로 권한 정보 저장
src/store/moudules디 렉 터 리 에서 정의permission.js1.비동기 방법 을 정의 합 니 다.방법 내부 에 HTTP 요청 이 포함 되 어 있 습 니 다.배경 에서 데 이 터 를 끌 어 올 립 니 다.
import http from '../../axios';
async function getUserInfo() {
 const res = await http.getUserInfo();
 return res;
}await키 워드 를 사용 하여 실행 순서 가 정확 하도록 합 니 다.다음 처리 에 편리 하도록 인터페이스 에서 되 돌아 오 는 내용 을 확보 하기 위해 서다.
const actions = {
 getPermissions({ commit }) {
 return new Promise(resolve => {
  getUserInfo().then(res => {
  if (res) {
   let permissionList = res.permissionList;
   commit('SET_PERMISSIONS', permissionList);
   //          ,           
   let accessRoutes = filterAsyncRoutesByPermissions(asyncRoutes, permissionList);
   commit('SET_ROUTES', accessRoutes);
   commit('SET_USER_INFO', { name: res.name, accountName: res.accountName })
   resolve(accessRoutes);
  } else {
   resolve([]);
  }
  }).catch(() => resolve([]));
 })
 }
}VueX 에서 action 은 비동기 방법 을 정의 합 니 다.2.정적,동적 경로 정의
src/router/index.js정적 경로:
export const constantRoutes = [
 {
  path: '/redirect',
  component: Layout,
  hidden: true,
  children: [
   {
    path: '/redirect/:path(.*)',
    component: () => import('@/views/redirect/index'),
   },
  ],
 ,
 ...
 {
  path: '/404',
  component: () => import('@/views/error-page/404'),
  hidden: true,
 }
];동적 경로:
export const asyncRoutes = [
 {
  path: '/system',
  component: Layout,
  name: '    ',
  meta: { title: '    ', icon: 'el-icon-user', affix: true },
  children: [
   {
    path: '/system',
    component: () => import('@/views/management/system/Index'),
    meta: { title: '    ', icon: 'el-icon-setting', affix: true },
   },
  ],
 }
...
]정적 루트 에서 모든 사용자 가 접근 할 수 있 는 루트 를 정 의 했 고 동적 루트 에서 동적 로드 루트 를 정의 했다.3.권한 에 따라 경로 필터 및 정렬
export function filterAsyncRoutesByPermissions(routes, menus) {
 const res = []
 routes.forEach(route => {
 const tmp = { ...route }
 let index = menus.map(menu => menu.url).indexOf(tmp.path);
 if (index != -1) {
  //                   
  tmp.name = menus[index].name;
  // debugger;
  tmp.meta.title = menus[index].name;
  tmp.children.forEach(child => {
  if (child.path == tmp.path) {
   child.meta.title = tmp.meta.title;
  }
  })
  res.push(tmp)
 }
 });
 //         ,      
 /**
 * TODO      
 */
 res.sort((routeA, routeB) => menus.map(menu => menu.url).indexOf(routeA.path) - menus.map(menu => menu.url).indexOf(routeB.path))
 return res
}url 에 따라 url 에 일치 하 는 경로 에 따라 배열 을 추가 합 니 다.최종 사용자 가 접근 할 수 있 는 경로=접근 할 수 있 는 동적 경로+권한 이 필요 없 는 정적 경로.4.src/permission.js 의 처리 논리
//   store
import store from './store';
const whiteList = ['/login', '/auth-redirect']; // no redirect whitelist
//     
router.beforeEach(async (to, from, next) => {
 //start progress bar
 NProgress.start()
 if (hasToken) {
  if (to.path === '/login') {
   // ...       
   NProgress.done();
  } else { 
   //             
   const hasRoutes = store.getters.permission_routes && store.getters.permission_routes.length > 0;
   if (hasRoutes) {
    next();
   } else {
    try {
     const accessRoutes = await store.dispatch('permission/getPermissions');
     router.addRoutes(accessRoutes);
     const toRoute = accessRoutes.filter((route) => route.path == to.path);
     next({ path: toRoute.length > 0 ? toRoute[0].path : accessRoutes[0].path, replace: true });
    } catch (error) {
     next(`/login?redirect=${to.path}`);
     NProgress.done();
    }
   }
  }
 } else {
  if (whiteList.indexOf(to.path) !== -1) {
   // in the free login whitelist, go directly
   next();
  } else {
   next(`/login?redirect=${to.path}`);
   NProgress.done();
  }
 }
});
router.afterEach(() => {
 // finish progress bar
 NProgress.done();
});이상 은 동적 경로 실현 방안 입 니 다.Vue 는 사용자 정의 명령 을 지원 합 니 다.사용 방법 은 Vue 원생 명령
v-model,v-on등 과 유사 합 니 다.인터넷 에서 찾 아 볼 수 있 는 대부분의 세분 화 권한 제어 방안 은 이런 방법 을 사용 합 니 다.다음은 나의 실현 을 보 여 줄 것 이다.사용자 정의 명령
사용자 정의 명령
v-permission:src/directive/permission/index.js 
import store from '@/store'
 export default {
 inserted(el, binding, vnode) {
 const { value } = binding
 const permissions = store.getters && store.getters.permissions;
 if (value) {
  //         vue        url
  let url = vnode.context.$route.path;
  let permissionActions = permissions[url];
  // console.log(permissionActions)
  const hasPermission = permissionActions.some(action => {
  if (value.constructor === Array) {
   //    :      1,      
   return value.includes(action);
  } else {
   return action === value;
  }
  })
  if (!hasPermission) {
  el.parentNode && el.parentNode.removeChild(el)
  }
 } else {
  throw new Error(`need further permissions!`)
 }
 }
}백 엔 드 에서 제공 하 는 권한 데 이 터 는 경로(url)와 작업 에 대응 하 는 Map 입 니 다.url 은 마 운 트 할 vnode 속성 을 통 해 얻 을 수 있 습 니 다.이 방법 은 AOP 와 유사 합 니 다.가상 요 소 를 마 운 트 한 후에 판단 하고 권한 이 없 으 면 부모 요소 에서 제거 합 니 다.사용 방법:
 <el-button @click.native.prevent="editUser(scope.row)" type="text" size="small" v-permission="'op_edit'">
          
 </el-button>드 롭 다운 메뉴 에 제어 추가:
 해당 데이터 정의 에 action 속성 이 증가 합 니 다.
이 방법 은 모든 장면 을 덮어 쓸 수 없 기 때문에 해당 도구 류 를 제공 합 니 다.
/**
 * 
 * @param {*      } url 
 * @param {*  code e.g op_add } value 
 * @return true/false        
 */
function checkPermission(url, value) {
 const permissions = store.getters && store.getters.permissions;
 let permissionActions = permissions[url];
 if (!permissionActions) {
  return false;
 }
 let hasPermission = permissionActions.some(action => {
  if (value.constructor === Array) {
   //    :      1,      
   return value.includes(action);
  } else {
   return action === value;
  }
 });
 return hasPermission;
}이상 완료 단추 입도 권한 제어.이상 은 vue 사용자 정의 명령 과 동적 경로 가 권한 통 제 를 실현 하 는 상세 한 내용 입 니 다.vue 사용자 정의 명령 과 동적 경로 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fastapi websocket 및 vue 3(Composition API)1부: FastAPI virtualenv 만들기(선택 사항) FastAPI 및 필요한 모든 것을 다음과 같이 설치하십시오. 생성main.py 파일 및 실행 - 브라우저에서 이 링크 열기http://127.0.0.1:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.