Tích hợp hệ thống đăng nhập Authentication Plugin trong CakePHP

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 19 tháng 1, 2025

Tích hợp hệ thống đăng nhập (Authentication Plugin) trong CakePHP

CakePHP cung cấp Authentication Plugin để dễ dàng quản lý xác thực người dùng trong ứng dụng. Dưới đây là các bước tích hợp hệ thống đăng nhập sử dụng plugin này.

1. Cài đặt Authentication Plugin

Chạy lệnh sau để cài đặt plugin Authentication:

composer require cakephp/authentication

Sau khi cài đặt, tải plugin trong file src/Application.php:

public function bootstrap(): void
{
    parent::bootstrap();
    $this->addPlugin('Authentication');
}

2. Cấu hình Authentication Middleware

Thêm middleware Authentication vào file src/Application.php trong phương thức middleware():

public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
    $middlewareQueue
        ->add(new AuthenticationMiddleware($this));

    return $middlewareQueue;
}

3. Cấu hình Authentication trong file src/Controller/AppController.php

Trong phương thức initialize(), thêm cấu hình:

use Authentication\Controller\Component\AuthenticationComponent;

public function initialize(): void
{
    parent::initialize();
    $this->loadComponent('Authentication.Authentication');
}

4. Cấu hình hệ thống xác thực

Tạo file cấu hình config/authentication.php để định nghĩa cách người dùng đăng nhập:

return [
    'Authentication' => [
        'default' => [
            'authenticators' => [
                'Authentication.Session',
                'Authentication.Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password',
                    ],
                    'loginUrl' => '/users/login',
                ],
            ],
            'identifiers' => [
                'Authentication.Password' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password',
                    ],
                    'resolver' => [
                        'className' => 'Authentication.Orm',
                    ],
                ],
            ],
        ],
    ],
];

5. Tạo bảng và Model User

Tạo bảng users trong cơ sở dữ liệu:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created DATETIME DEFAULT CURRENT_TIMESTAMP,
    modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Tạo Model cho bảng:

bin/cake bake model Users

6. Tạo Controller và Views cho User

6.1. Tạo Controller

Tạo Controller UsersController.php:

bin/cake bake controller Users

Thêm logic đăng nhập và đăng xuất:

public function login()
{
    $this->request->allowMethod(['get', 'post']);
    $result = $this->Authentication->getResult();

    if ($result->isValid()) {
        // Chuyển hướng sau khi đăng nhập thành công
        $redirect = $this->request->getQuery('redirect', [
            'controller' => 'Pages',
            'action' => 'display',
            'home',
        ]);
        return $this->redirect($redirect);
    }

    if ($this->request->is('post') && !$result->isValid()) {
        $this->Flash->error('Đăng nhập không thành công, vui lòng thử lại.');
    }
}

public function logout()
{
    $this->Authentication->logout();
    return $this->redirect(['controller' => 'Users', 'action' => 'login']);
}

6.2. Tạo Views

Tạo file templates/Users/login.php:

<h1>Đăng nhập</h1>
<?= $this->Form->create() ?>
    <?= $this->Form->control('email', ['label' => 'Email']) ?>
    <?= $this->Form->control('password', ['label' => 'Mật khẩu']) ?>
    <?= $this->Form->button('Đăng nhập') ?>
<?= $this->Form->end() ?>

7. Bảo vệ các Controller khác

Để yêu cầu đăng nhập trước khi truy cập, sử dụng beforeFilter trong các Controller:

public function beforeFilter(\Cake\Event\EventInterface $event)
{
    parent::beforeFilter($event);
    $this->Authentication->addUnauthenticatedActions(['login']);
}

Ngoài ra, bạn có thể kiểm tra người dùng hiện tại:

$user = $this->Authentication->getIdentity();
if ($user) {
    $this->set('loggedInUser', $user->getOriginalData());
}

8. Mã hoá mật khẩu người dùng

Khi tạo hoặc sửa người dùng, hãy sử dụng DefaultPasswordHasher để mã hoá mật khẩu:

use Cake\Auth\DefaultPasswordHasher;

$password = (new DefaultPasswordHasher())->hash($this->request->getData('password'));

9. Kiểm tra kết quả

  1. Truy cập URL:

    http://yourdomain.com/users/login
    
  2. Đăng nhập với thông tin hợp lệ từ bảng users.

  3. Nếu đăng nhập thành công, bạn sẽ được chuyển hướng đến trang chính.

  4. Đăng xuất bằng cách truy cập:

    http://yourdomain.com/users/logout
    

Kết luận

Hệ thống đăng nhập sử dụng Authentication Plugin trong CakePHP cung cấp một giải pháp mạnh mẽ, bảo mật và dễ tích hợp. Bạn có thể mở rộng thêm như quản lý vai trò (roles), phân quyền (authorization), và các tính năng khác để đáp ứng nhu cầu của dự án.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ