×

Hướng dẫn viết class đăng nhập người dùng bằng PHP và MySQL

Việc xây dựng một hệ thống đăng nhập người dùng an toàn và hiệu quả là một phần quan trọng trong phát triển ứng dụng web. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách viết một class đăng nhập người dùng bằng PHP và MySQL. Class này sẽ giúp bạn quản lý việc xác thực người dùng một cách đơn giản và dễ dàng hơn.

Tại sao lại cần class đăng nhập?

Việc sử dụng class đăng nhập không chỉ giúp tổ chức mã nguồn một cách tốt hơn mà còn cải thiện tính tái sử dụng và bảo trì. Với class, bạn có thể dễ dàng mở rộng tính năng, như thêm xác thực theo nhiều cách khác nhau hoặc tích hợp quản lý phiên (session management). Bên cạnh đó, việc xử lý lỗi và quản lý trạng thái người dùng cũng trở nên dễ dàng hơn.

Cấu trúc và chức năng của class

Class đăng nhập người dùng sẽ tích hợp các chức năng cơ bản như:

  • Kết nối đến cơ sở dữ liệu MySQL.
  • Kiểm tra tính hợp lệ của thông tin đăng nhập.
  • Xử lý thông báo lỗi.
  • Quản lý phiên cho người dùng.
  • Cung cấp một số chức năng phụ trợ khác.

Kết nối đến cơ sở dữ liệu MySQL

Trước khi xây dựng class, chúng ta cần kết nối đến cơ sở dữ liệu. Dưới đây là một đoạn mã mẫu để thực hiện việc kết nối:

class Database {
    private $host = 'localhost';
    private $db_name = 'ten_database';
    private $username = 'ten_nguoi_dung';
    private $password = 'mat_khau';
    public $conn;

    public function dbConnection() {
        $this->conn = null;        
        try {
            $this->conn = new PDO("mysql:host=".$this->host.";dbname=".$this->db_name, $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $exception) {
            echo "Connection error: " . $exception->getMessage();
        }
        return $this->conn;
    }
}

Tạo class đăng nhập

Bây giờ, chúng ta sẽ tạo class UserLogin để xử lý việc đăng nhập người dùng. Class này sẽ chứa các phương thức như checkLogin, startSession, và logout.

class UserLogin {
    private $db;

    public function __construct($database) {
        $this->db = $database;
    }

    public function checkLogin($username, $password) {
        $stmt = $this->db->prepare("SELECT * FROM users WHERE username = :username");
        $stmt->bindParam(':username', $username);
        $stmt->execute();
        $user = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($user) {
            if (password_verify($password, $user['password'])) {
                $this->startSession($user['id']);
                return true;
            } else {
                return false; // Mật khẩu không đúng
            }
        } else {
            return false; // Tên người dùng không tồn tại
        }
    }

    private function startSession($userId) {
        session_start();
        $_SESSION['user_id'] = $userId;
    }

    public function logout() {
        session_start();
        session_unset();
        session_destroy();
    }
}

Kiểm tra và xử lý thông tin đăng nhập

Bây giờ chúng ta hãy tích hợp lớp UserLogin vào một trang đăng nhập đơn giản.

require_once 'Database.php';
require_once 'UserLogin.php';

$database = new Database();
$db = $database->dbConnection();

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $login = new UserLogin($db);

    if ($login->checkLogin($username, $password)) {
        echo "Đăng nhập thành công!";
        // Chuyển hướng đến trang chính
    } else {
        echo "Đăng nhập thất bại. Vui lòng kiểm tra tên người dùng và mật khẩu.";
    }
}
?>

<form method="POST" action="">
    Tên đăng nhập: <input type="text" name="username">
    Mật khẩu: <input type="password" name="password">
    <button type="submit">Đăng nhập</button>
</form>

Bảo mật và các biện pháp bảo vệ

Khi xây dựng ứng dụng web, bảo mật luôn là mối quan tâm hàng đầu. Dưới đây là một số phương pháp bạn nên áp dụng:

  • Mã hóa mật khẩu: Sử dụng hàm password_hash khi lưu mật khẩu vào cơ sở dữ liệu, và password_verify để xác thực.
  • Xử lý SQL Injection: Sử dụng Prepared Statements để tránh các cuộc tấn công SQL Injection.
  • Bảo vệ chống Brute Force: Đặt giới hạn số lần đăng nhập sai trong một khoảng thời gian nhất định.

Kết luận

Class đăng nhập người dùng bằng PHP và MySQL rất hữu ích cho việc xây dựng hệ thống xác thực, giúp mã nguồn sạch sẽ và dễ bảo trì hơn. Với class này, bạn đã có một khung nền tảng để phát triển các chức năng quản lý người dùng phức tạp hơn.

Hy vọng rằng bài viết này đã cung cấp cho bạn những thông tin cần thiết để bắt đầu tạo class đăng nhập người dùng. Hãy chú ý đến các vấn đề bảo mật và mã hóa để đảm bảo rằng hệ thống của bạn luôn an toàn. Chúc bạn thành công trong việc phát triển ứng dụng của riêng mình!

Comments