Phân quyền người dùng Authorization Plugin trong CakePHP
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.

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.
Xem thêm

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