You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:57:01