浏览代码

优化菜单规则中的条件判断

Karson 4 年之前
父节点
当前提交
cdebb284c3
共有 1 个文件被更改,包括 13 次插入5 次删除
  1. 13 5
      extend/fast/Auth.php

+ 13 - 5
extend/fast/Auth.php

@@ -140,7 +140,7 @@ class Auth
 
     /**
      * 根据用户id获取用户组,返回值为数组
-     * @param  int $uid 用户id
+     * @param int $uid  用户id
      * @return array       用户所属的用户组 array(
      *                  array('uid'=>'用户id','group_id'=>'用户组id','name'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
      *                  ...)
@@ -205,9 +205,17 @@ class Auth
             if (!empty($rule['condition']) && !in_array('*', $ids)) {
                 //根据condition进行验证
                 $user = $this->getUserInfo($uid); //获取用户信息,一维数组
-                $command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);
-                @(eval('$condition=(' . $command . ');'));
-                if ($condition) {
+                $nums = 0;
+                $condition = str_replace(['&&', '||'], "\r\n", $rule['condition']);
+                $condition = preg_replace('/\{(\w*?)\}/', '\\1', $condition);
+                $conditionArr = explode("\r\n", $condition);
+                foreach ($conditionArr as $index => $item) {
+                    preg_match("/^(\w+)\s?([\>\<\=]+)\s?(.*)$/", trim($item), $matches);
+                    if ($matches && isset($user[$matches[1]]) && version_compare($user[$matches[1]], $matches[3], $matches[2])) {
+                        $nums++;
+                    }
+                }
+                if ($conditionArr && ((stripos($rule['condition'], "||") !== false && $nums > 0) || count($conditionArr) == $nums)) {
                     $rulelist[$rule['id']] = strtolower($rule['name']);
                 }
             } else {
@@ -254,4 +262,4 @@ class Auth
 
         return $user_info[$uid];
     }
-}
+}