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

如何在后台管理面板中对非管理员用户隐藏部分导航栏页面?

根据用户角色动态控制导航栏显示项

刚好碰到过一模一样的需求,我来分享下我的实现过程和最终解决办法:

我的初始实现方式

最开始我是把所有5个导航链接都统一放在navbar.php文件里,然后在Index.php、page2.php、page3.php、page4.php、Page5.php这几个页面里通过PHP的include来复用这个导航栏,每个页面的结构大概是这样:

<?php include('includes/navbar.php'); ?>
<!-- 页面主体内容 -->
<?php include('includes/footer.php'); ?>

这样不管点击哪个页面,导航栏都能正常显示,省了不少重复代码。但问题来了:普通用户登录后,我不想让他们看到管理员专属的页面1,毕竟那个页面的功能只有管理员能操作。

原用户角色验证逻辑

我的登录验证代码(code.php)里已经有判断用户是管理员还是普通用户的逻辑了,代码如下:

if(isset($_POST['login_btn'])) {
    $email_login = $_POST['emaill'];
    $password_login = $_POST['passwordd'];
    $query = "SELECT * FROM register WHERE email='$email_login' LIMIT 1";
    $query_run = mysqli_query($connection, $query);
    $password = "SELECT password FROM register WHERE email='$email_login'";
    $usertypes = mysqli_fetch_array($query_run);
    if($usertypes['usertype'] == "admin") {
        if(!password_verify($password_login, $password)) {
            $_SESSION['username'] = $usertypes['username'];
            header('Location: index.php');
        } else {
            $_SESSION['status'] = "Email / Password is Invalid";
            header('Location: login.php');
        }
    } else if ($usertypes['usertype'] == "user") {
        if(!password_verify($password_login, $password)){
            $_SESSION['username'] = $usertypes['username'];
            header('Location: index2.php');
        } else {
            $_SESSION['status'] = "Email / Password is Invalid";
            header('Location: login.php');
        }
    }
}

这里要提个小问题:原代码里的$password变量只是写了一条SQL语句,并没有执行查询拿到实际的哈希密码,这样password_verify是没办法正常验证的,得改成$password = $usertypes['password'];才行,因为我们已经通过$query查询到了用户的所有信息,直接从$usertypes数组里取密码就行。

最终解决方案:动态控制导航项显示

后来我找到了完美的解决办法:只需要在navbar.php里,给管理员专属的导航项加上PHP条件判断,只有当session里的用户角色是admin时才显示这个导航项。

具体代码如下:

<!-- 其他所有用户都能看到的导航项 -->
<li class="nav-item">
    <a class="nav-link" href="page2.php">Page 2</a>
</li>
<li class="nav-item">
    <a class="nav-link" href="page3.php">Page 3</a>
</li>

<!-- 管理员专属导航项,只有管理员登录才显示 -->
<?php if(isset($_SESSION['TYPE']) && $_SESSION['TYPE'] == 'admin'): ?>
    <li class="nav-item">
        <a class="nav-link" href="PageForAdmin.php">
            <i class="fas fa-user" style="font-size: 20px;"></i>
            <span>Page For Admin</span>
        </a>
    </li>
<?php endif; ?>

<!-- 其他通用导航项 -->
<li class="nav-item">
    <a class="nav-link" href="page4.php">Page 4</a>
</li>
<li class="nav-item">
    <a class="nav-link" href="Page5.php">Page 5</a>
</li>

几个重要的注意点

  1. 一定要初始化Session:在所有用到$_SESSION的页面开头,都要加上session_start();,不然读取不到session里的用户角色信息;
  2. 登录时存入用户角色:在登录验证通过后,记得把用户的角色存入session,比如在管理员登录成功的代码里加上$_SESSION['TYPE'] = $usertypes['usertype'];,普通用户登录时也要加同样的代码;
  3. 判断Session是否存在:加上isset($_SESSION['TYPE'])可以避免用户未登录时出现PHP警告,更安全。

内容的提问来源于stack exchange,提问作者Corbin Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:17:32