如何修改PHP的page_require_level函数以支持多用户级别访问?
页面权限控制函数扩展实现
问题描述
当前使用的page_require_level函数仅支持传入单个整数用户级别参数(如page_require_level(1)),仅对应级别用户可访问页面。需要扩展该函数,支持传入2个或3个用户级别参数,允许对应多个级别的用户访问。尝试连续调用page_require_level(1);和page_require_level(2);会导致所有用户被拦截,移除类型转换后问题依旧。
原函数代码
/*--------------------------------------------------------------*/ /* Find user level /*--------------------------------------------------------------*/ function find_by_userLevel($user_level) { global $db; $sql = "SELECT user_level FROM users WHERE user_level = '{$db->escape($user_level)}' LIMIT 1 "; $result = $db->query($sql); return($db->num_rows($result) === 0 ? true : false); } /*--------------------------------------------------------------*/ /* Function for checking which user level has access to the page /*--------------------------------------------------------------*/ function page_require_level($require_user_level){ global $session; $current_user = current_user(); $user_level = find_by_userLevel($current_user['user_level']); //if user not login if (!$session->isUserLoggedIn(true)): $session->msg('d','Sign n plz'); redirect('index.php', false); //checking logged in User level and Require level is equal to elseif($current_user['user_level'] != (int)$require_user_level): $session->msg("d", "U don't have to view this"); redirect('home.php', false); else: return true; endif; }
修改后的解决方案
1. 核心函数修改:支持多级别参数
将page_require_level改为可变参数函数,接收任意数量的级别参数,检查当前用户级别是否在允许列表内:
/*--------------------------------------------------------------*/ /* Function for checking which user level has access to the page /*--------------------------------------------------------------*/ function page_require_level(...$require_user_levels){ global $session; $current_user = current_user(); // 未登录用户直接拦截 if (!$session->isUserLoggedIn(true)): $session->msg('d','请先登录'); redirect('index.php', false); endif; // 转换当前用户级别为整数,统一类型 $current_level = (int)$current_user['user_level']; // 遍历允许的级别,判断是否有权限 $has_access = false; foreach ($require_user_levels as $level) { if ($current_level === (int)$level) { $has_access = true; break; } } // 无权限则跳转拦截 if (!$has_access): $session->msg("d", "你没有访问该页面的权限"); redirect('home.php', false); else: return true; endif; }
2. 辅助函数优化(可选)
原find_by_userLevel函数的返回逻辑存在歧义(未找到级别返回true,找到返回false),建议调整为更直观的逻辑:
/*--------------------------------------------------------------*/ /* 验证用户级别是否存在 /*--------------------------------------------------------------*/ function find_by_userLevel($user_level) { global $db; $sql = "SELECT user_level FROM users WHERE user_level = '{$db->escape($user_level)}' LIMIT 1 "; $result = $db->query($sql); // 存在返回true,不存在返回false return $db->num_rows($result) > 0; }
注:如果当前用户的级别已经通过current_user()合法获取,也可以直接移除该函数的调用,减少不必要的数据库查询。
3. 使用示例
修改后可直接传入多个级别参数,兼容原有单参数用法:
- 允许级别1和2的用户访问:
page_require_level(1, 2); - 允许级别1、2、3的用户访问:
page_require_level(1, 2, 3); - 保留原单参数使用:
page_require_level(1);
问题原因说明
连续调用page_require_level(1);和page_require_level(2);会触发逻辑冲突:级别1的用户会通过第一个检查,但第二个检查会判断1 != 2并拦截;级别2的用户则会被第一个检查拦截,最终导致所有用户无法访问。
内容的提问来源于stack exchange,提问作者Nader Hussein
相关产品推荐
相关产品推荐

