浏览代码

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

RuoYi 5 月之前
父节点
当前提交
1810f30491
共有 2 个文件被更改,包括 23 次插入6 次删除
  1. 8 3
      ruoyi-ui/src/permission.js
  2. 15 3
      ruoyi-ui/src/utils/validate.js

+ 8 - 3
ruoyi-ui/src/permission.js

@@ -4,11 +4,16 @@ import { Message } from 'element-ui'
 import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import { getToken } from '@/utils/auth'
+import { isPathMatch } from '@/utils/validate'
 import { isRelogin } from '@/utils/request'
 
 NProgress.configure({ showSpinner: false })
 
-const whiteList = ['/login', '/register']
+const whiteList = ['/login', '/register', '/register*', '/register/*']
+
+const isWhiteList = (path) => {
+  return whiteList.some(pattern => isPathMatch(pattern, path))
+}
 
 router.beforeEach((to, from, next) => {
   NProgress.start()
@@ -18,7 +23,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 (store.getters.roles.length === 0) {
@@ -43,7 +48,7 @@ router.beforeEach((to, from, next) => {
     }
   } else {
     // 没有token
-    if (whiteList.indexOf(to.path) !== -1) {
+    if (isWhiteList(to.path)) {
       // 在免登录白名单,直接进入
       next()
     } else {

+ 15 - 3
ruoyi-ui/src/utils/validate.js

@@ -1,13 +1,25 @@
 /**
+ * 路径匹配器
+ * @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
  * @returns {Boolean}
  */
 export function isEmpty(value) {
   if (value == null || value == "" || value == undefined || value == "undefined") {
-    return true;
+    return true
   }
-  return false;
+  return false
 }
 
 /**
@@ -87,7 +99,7 @@ export function validEmail(email) {
  * @returns {Boolean}
  */
 export function isString(str) {
-  return typeof str === 'string' || str instanceof String;
+  return typeof str === 'string' || str instanceof String
 }
 
 /**