ソースを参照

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

RuoYi 8 ヶ月 前
コミット
535c5bd814
2 ファイル変更24 行追加11 行削除
  1. 9 5
      src/permission.js
  2. 15 6
      src/utils/validate.js

+ 9 - 5
src/permission.js

@@ -3,15 +3,19 @@ import { ElMessage } from 'element-plus'
 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'
 import usePermissionStore from '@/store/modules/permission'
 
-NProgress.configure({ showSpinner: false });
+NProgress.configure({ showSpinner: false })
 
-const whiteList = ['/login', '/register'];
+const whiteList = ['/login', '/register']
+
+const isWhiteList = (path) => {
+  return whiteList.some(pattern => isPathMatch(pattern, path))
+}
 
 router.beforeEach((to, from, next) => {
   NProgress.start()
@@ -21,7 +25,7 @@ router.beforeEach((to, from, next) => {
     if (to.path === '/login') {
       next({ path: '/' })
       NProgress.done()
-    } else if (whiteList.indexOf(to.path) !== -1) {
+    } else if (isWhiteList(to.path)) {
       next()
     } else {
       if (useUserStore().roles.length === 0) {
@@ -50,7 +54,7 @@ router.beforeEach((to, from, next) => {
     }
   } else {
     // 没有token
-    if (whiteList.indexOf(to.path) !== -1) {
+    if (isWhiteList(to.path)) {
       // 在免登录白名单,直接进入
       next()
     } else {

+ 15 - 6
src/utils/validate.js

@@ -1,3 +1,15 @@
+/**
+ * 路径匹配器
+ * @param {string} pattern
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isPathMatch(pattern, path) {
+  const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*')
+  const regex = new RegExp(`^${regexPattern}$`)
+  return regex.test(path)
+}
+
 /**
  * 判断value字符串是否为空 
  * @param {string} value
@@ -5,9 +17,9 @@
  */
 export function isEmpty(value) {
   if (value == null || value == "" || value == undefined || value == "undefined") {
-    return true;
+    return true
   }
-  return false;
+  return false
 }
 
 /**
@@ -87,10 +99,7 @@ export function validEmail(email) {
  * @returns {Boolean}
  */
 export function isString(str) {
-  if (typeof str === 'string' || str instanceof String) {
-    return true
-  }
-  return false
+  return typeof str === 'string' || str instanceof String
 }
 
 /**