php实现网页登录权限
PHP 实现网页登录权限
数据库设计
创建用户表存储登录信息,至少包含用户名和密码字段。密码应使用哈希算法(如 password_hash)存储。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
用户注册
处理用户注册时对密码进行哈希处理,示例代码:
$username = $_POST['username'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
$stmt->execute([$username, $password]);
用户登录验证
验证用户输入的用户名和密码是否匹配数据库记录:
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
header("Location: dashboard.php");
} else {
echo "Invalid username or password";
}
会话管理
使用 PHP 会话跟踪用户登录状态:
session_start();
// 检查用户是否登录
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
权限控制
根据用户角色或权限限制访问特定页面:
// 假设用户表有 role 字段
$stmt = $pdo->prepare("SELECT role FROM users WHERE id = ?");
$stmt->execute([$_SESSION['user_id']]);
$user = $stmt->fetch();
if ($user['role'] !== 'admin') {
header("Location: unauthorized.php");
exit;
}
密码重置
实现密码重置功能,通常包括生成令牌和发送重置链接:
// 生成令牌并存储
$token = bin2hex(random_bytes(32));
$stmt = $pdo->prepare("UPDATE users SET reset_token = ?, token_expires = DATE_ADD(NOW(), INTERVAL 1 HOUR) WHERE email = ?");
$stmt->execute([$token, $_POST['email']]);
// 发送包含令牌的邮件
$resetLink = "https://example.com/reset-password.php?token=$token";
mail($_POST['email'], "Password Reset", "Click here to reset: $resetLink");
安全注意事项
- 使用 HTTPS 保护数据传输
- 对用户输入进行验证和过滤
- 设置会话过期时间
- 防止暴力破解,可实施登录尝试限制
- 定期更新密码哈希算法
完整登录示例
以下是一个简单的登录表单处理示例:

// login.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
header("Location: dashboard.php");
exit;
} else {
$error = "Invalid credentials";
}
}
<!-- login form -->
<form method="post">
<input type="text" name="username" required>
<input type="password" name="password" required>
<button type="submit">Login</button>
<?php if (isset($error)) echo "<p>$error</p>"; ?>
</form>






