如何在后台管理面板中对非管理员用户隐藏部分导航栏页面?
根据用户角色动态控制导航栏显示项
刚好碰到过一模一样的需求,我来分享下我的实现过程和最终解决办法:
我的初始实现方式
最开始我是把所有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>
几个重要的注意点
- 一定要初始化Session:在所有用到
$_SESSION的页面开头,都要加上session_start();,不然读取不到session里的用户角色信息; - 登录时存入用户角色:在登录验证通过后,记得把用户的角色存入session,比如在管理员登录成功的代码里加上
$_SESSION['TYPE'] = $usertypes['usertype'];,普通用户登录时也要加同样的代码; - 判断Session是否存在:加上
isset($_SESSION['TYPE'])可以避免用户未登录时出现PHP警告,更安全。
内容的提问来源于stack exchange,提问作者Corbin Jones
相关产品推荐
相关产品推荐

