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.js
1.비동기 방법 을 정의 합 니 다.방법 내부 에 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에 따라 라이센스가 부여됩니다.