php案例教程:构建安全的用户认证系统
构建安全的用户认证系统:PHP案例教程
用户认证是Web应用程序中的一个重要功能,它确保只有合法用户才能访问受保护的资源。本文将向您介绍如何使用PHP构建一个安全的用户认证系统。我们将涵盖用户注册、密码加密、登录验证、会话管理和权限控制等关键步骤,并提供一个完整的案例教程。
- 用户注册
用户注册是用户认证系统的第一步。在注册过程中,我们需要验证用户输入的信息,确保其唯一性,并对密码进行加密存储。以下是一个简单的用户注册表单:
<form action="register.php" method="post">
用户名:<input type="text" name="username" required>
密码:<input type="password" name="password" required>
邮箱:<input type="email" name="email" required>
<input type="submit" value="注册">
</form>
在register.php
文件中,我们可以使用PHP内置的filter_var()
函数进行数据验证,并使用password_hash()
函数对密码进行加密:
<?php
// 连接数据库
$mysqli = new mysqli("localhost", "username", "password", "database");
// 检查数据库连接
if($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 验证数据
if($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
// 检查用户名是否已存在
$query = "SELECT * FROM users WHERE username = '$username'";
$result = $mysqli->query($query);
if($result->num_rows > 0) {
die("该用户名已存在。");
}
// 插入新用户
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$query = "INSERT INTO users (username, email, password) VALUES ('$username', '$email', '$hashed_password')";
if($mysqli->query($query) === TRUE) {
echo "新用户注册成功!";
} else {
echo "注册失败: " . $mysqli->error;
}
}
?>
- 登录验证
用户登录验证是用户认证系统的核心功能。我们需要验证用户输入的用户名和密码,并通过会话管理为合法用户提供持久化的身份状态。以下是一个简单的用户登录表单:
<form action="login.php" method="post">
用户名:<input type="text" name="username" required>
密码:<input type="password" name="password" required>
<input type="submit" value="登录">
</form>
在login.php
文件中,我们可以使用password_verify()
函数对密码进行比对,并使用session_start()
函数启动会话:
<?php
// 连接数据库
$mysqli = new mysqli("localhost", "username", "password", "database");
// 检查数据库连接
if($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 检查用户名和密码
session_start();
if($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST["username"];
$password = $_POST["password"];
$query = "SELECT * FROM users WHERE username = '$username'";
$result = $mysqli->query($query);
if($result->num_rows > 0) {
$row = $result->fetch_assoc();
if(password_verify($password, $row["password"])) {
$_SESSION["loggedin"] = true;
$_SESSION["username"] = $username;
echo "登录成功!";
} else {
echo "密码错误。";
}
} else {
echo "该用户名不存在。";
}
}
?>