Phân quyền người dùng Authorization Plugin trong CakePHP

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

Phân quyền người dùng (Authorization Plugin) trong CakePHP

CakePHP cung cấp Authorization Plugin để giúp bạn dễ dàng kiểm soát quyền truy cập của người dùng đến các tài nguyên trong ứng dụng. Plugin này hỗ trợ quản lý quyền truy cập theo vai trò, quy tắc và ngữ cảnh.

1. Cài đặt Authorization Plugin

Sử dụng Composer để cài đặt plugin:

composer require cakephp/authorization

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

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

2. Thêm Middleware Authorization

Thêm AuthorizationMiddleware vào hàng đợi middleware trong file src/Application.php:

use Authorization\Middleware\AuthorizationMiddleware;

public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
    $middlewareQueue
        ->add(new AuthorizationMiddleware($this, [
            'unauthorizedHandler' => [
                'className' => 'Authorization.Redirect',
                'url' => '/users/login',
                'queryParam' => 'redirectUrl',
                'exceptions' => [
                    MissingIdentityException::class,
                    ForbiddenException::class,
                ],
            ],
        ]));

    return $middlewareQueue;
}

3. Cấu hình Authorization Component

Trong file src/Controller/AppController.php, thêm cấu hình:

use Authorization\Controller\Component\AuthorizationComponent;

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

4. Tạo Roles (Vai trò) cho người dùng

Thêm cột role vào bảng users để quản lý vai trò người dùng:

ALTER TABLE users ADD role ENUM('admin', 'user') DEFAULT 'user';

5. Định nghĩa Policy (Chính sách)

Chính sách được sử dụng để kiểm tra quyền truy cập. Tạo thư mục src/Policy nếu chưa tồn tại. Sau đó, tạo file policy UserPolicy.php:

namespace App\Policy;

use Authorization\IdentityInterface;

class UserPolicy
{
    // Quy tắc cho phép người dùng xem trang
    public function canView(IdentityInterface $user, $resource)
    {
        return true; // Cho phép tất cả xem
    }

    // Quy tắc chỉ admin được chỉnh sửa
    public function canEdit(IdentityInterface $user, $resource)
    {
        return $user->get('role') === 'admin';
    }
}

6. Liên kết Policy với Entity

Khai báo policy liên kết với Entity trong file src/Policy/ResolverCollection.php:

namespace App\Policy;

use Authorization\Policy\ResolverCollection;
use Authorization\Policy\OrmResolver;

class Resolver extends ResolverCollection
{
    public function __construct()
    {
        $this->addResolver(new OrmResolver());
    }
}

7. Áp dụng Authorization trong Controller

Trong các Controller, kiểm tra quyền trước khi xử lý:

public function beforeFilter(\Cake\Event\EventInterface $event)
{
    parent::beforeFilter($event);

    // Kiểm tra quyền xem
    $this->Authorization->authorize($this->request, 'view');

    // Chỉ admin mới được chỉnh sửa
    if (!$this->Authorization->can('edit', $this->Authentication->getIdentity())) {
        throw new ForbiddenException('Bạn không có quyền truy cập.');
    }
}

8. Hiển thị theo quyền trong View

Dựa trên vai trò người dùng, bạn có thể tùy chỉnh giao diện. Ví dụ:

if ($this->Identity->isLoggedIn() && $this->Identity->get('role') === 'admin') {
    echo $this->Html->link('Quản lý người dùng', ['controller' => 'Users', 'action' => 'index']);
}

9. Xử lý lỗi Unauthorized

Nếu người dùng không có quyền, bạn có thể hiển thị thông báo lỗi hoặc chuyển hướng:

use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\UnauthorizedException;

public function beforeFilter(\Cake\Event\EventInterface $event)
{
    try {
        $this->Authorization->authorize($this->request);
    } catch (UnauthorizedException $e) {
        $this->Flash->error('Bạn không có quyền truy cập.');
        return $this->redirect(['controller' => 'Users', 'action' => 'login']);
    } catch (ForbiddenException $e) {
        $this->Flash->error('Truy cập bị từ chối.');
        return $this->redirect(['controller' => 'Pages', 'action' => 'home']);
    }
}

10. Kết quả

  • Người dùng thường chỉ có thể truy cập các trang được cho phép (vd: view).
  • Quản trị viên có thể thực hiện các hành động nâng cao như edit, delete.

Kết luận

Authorization Plugin là một công cụ mạnh mẽ giúp bạn kiểm soát quyền truy cập của người dùng một cách chi tiết và linh hoạt. Hãy kết hợp plugin này với Authentication Plugin để xây dựng hệ thống bảo mật toàn diện cho ứng dụng của bạ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ệ