
本教程旨在详细讲解如何在php应用中实现基于用户类型的页面访问控制。我们将深入探讨php会话(session)机制的正确使用,包括`session_start()`的必要性、会话变量的设置与验证,以及如何构建健壮的访问权限逻辑,以确保特定页面仅对指定用户类型开放,同时避免常见的重定向循环问题。
1. 理解PHP会话(Session)与访问控制
在Web应用中,会话(Session)是维护用户状态的关键机制。由于HTTP是无状态协议,每次请求都是独立的,会话允许服务器存储关于用户的信息(如登录状态、用户类型等),并在用户浏览不同页面时保持这些信息。实现基于用户类型的访问控制,核心在于以下几点:
- 会话启动: 在每个需要访问或设置会话变量的PHP脚本开始时,必须调用session_start()函数。
- 用户认证: 用户登录成功后,将用户的关键信息(如loggedin状态和usertype)存储到$_SESSION全局数组中。
- 权限验证: 在受保护的页面上,检查$_SESSION中存储的用户信息,判断用户是否具有访问权限。
- 重定向处理: 如果用户不具备权限,将其重定向到登录页面或无权限提示页面,并终止当前脚本执行。
2. 核心问题分析与解决方案
原始代码中存在两个主要问题,导致访问控制失效:

- dashboard.php中缺少session_start(): 任何需要访问$_SESSION变量的页面都必须在脚本的最顶部调用session_start()。如果缺少此函数,$_SESSION数组将为空,导致无法获取到用户的登录状态和用户类型。
- dashboard.php中错误的重定向逻辑: 当用户被授权访问页面时,不应该再次重定向到当前页面(header('Location: '.$_SERVER['PHP_SELF']);)。这会创建一个无限重定向循环。正确的做法是,如果用户有权限,则允许页面继续加载其内容;如果无权限,才重定向到登录页。
3. 完善登录与会话管理
首先,确保login.php在用户成功登录后,正确地启动会话并设置必要的会话变量。
login.php (关键部分)
立即学习“PHP免费学习笔记(深入)”;
<?php
// Initialize the session (ensure this is at the very top)
session_start();
// ... (省略其他变量定义、错误处理和数据库连接代码) ...
// 在用户凭据验证成功后
if(password_verify($password, $hashed_password)){
// Password is correct, so start a new session
// session_start(); // 这一行在脚本开头已经有了,这里不需要重复
// Store data in session variables
$_SESSION["loggedin"] = true;
$_SESSION["id"] = $id;
$_SESSION["usertype"] = $usertype;
// 根据用户类型重定向到不同的欢迎页面
if($usertype == "admin"){
header("location: welcome_admin.php");
} elseif($usertype == "manager"){
header("location: welcome_manager.php");
}elseif($usertype == "delivery"){
header("location: welcome_delivery.php");
}
exit; // 总是使用 exit; 终止脚本执行
} else {
// 密码无效
$login_err = "Invalid usertype or password.";
}
// ... (省略其他代码) ...
?>登录后复制
说明:
标签: css php word html js bootstrap go npm 浏览器 access session cdn
还木有评论哦,快来抢沙发吧~