Эх сурвалжийг харах

update 优化 白名单支持对通配符路径匹配

疯狂的狮子Li 7 сар өмнө
parent
commit
fd01b5a61f

+ 7 - 3
src/permission.ts

@@ -3,7 +3,7 @@ import router from './router';
 import NProgress from 'nprogress';
 import 'nprogress/nprogress.css';
 import { getToken } from '@/utils/auth';
-import { isHttp } from '@/utils/validate';
+import { isHttp, isPathMatch } from '@/utils/validate';
 import { isRelogin } from '@/utils/request';
 import useUserStore from '@/store/modules/user';
 import useSettingsStore from '@/store/modules/settings';
@@ -12,6 +12,10 @@ import usePermissionStore from '@/store/modules/permission';
 NProgress.configure({ showSpinner: false });
 const whiteList = ['/login', '/register', '/social-callback'];
 
+const isWhiteList = (path: string) => {
+  return whiteList.some(pattern => isPathMatch(pattern, path))
+}
+
 router.beforeEach(async (to, from, next) => {
   NProgress.start();
   if (getToken()) {
@@ -20,7 +24,7 @@ router.beforeEach(async (to, from, next) => {
     if (to.path === '/login') {
       next({ path: '/' });
       NProgress.done();
-    } else if (whiteList.indexOf(to.path as string) !== -1) {
+    } else if (isWhiteList(to.path)) {
       next();
     } else {
       if (useUserStore().roles.length === 0) {
@@ -49,7 +53,7 @@ router.beforeEach(async (to, from, next) => {
     }
   } else {
     // 没有token
-    if (whiteList.indexOf(to.path as string) !== -1) {
+    if (isWhiteList(to.path)) {
       // 在免登录白名单,直接进入
       next();
     } else {

+ 12 - 0
src/utils/validate.ts

@@ -1,3 +1,15 @@
+/**
+ * 路径匹配器
+ * @param {string} pattern
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isPathMatch(pattern: string, path: string) {
+  const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*')
+  const regex = new RegExp(`^${regexPattern}$`)
+  return regex.test(path)
+}
+
 /**
  * 判断url是否是http或https
  * @returns {Boolean}