Casbin
Giới thiệu
Casbin là một khung kiểm soát truy cập mã nguồn mở mạnh mẽ và hiệu quả, cơ chế quản lý quyền của nó hỗ trợ nhiều mô hình kiểm soát truy cập khác nhau.
Địa chỉ dự án
https://github.com/teamones-open/casbin
Cài đặt
composer require teamones/casbin
Trang web chính thức của Casbin
Để biết cách sử dụng chi tiết, bạn có thể tham khảo tài liệu chính thức bằng tiếng Trung, ở đây chỉ đề cập đến cách cấu hình và sử dụng trong webman.
https://casbin.org/docs/zh-CN/overview
Cấu trúc thư mục
.
├── config Thư mục cấu hình
│ ├── casbin-restful-model.conf Tệp cấu hình mô hình quyền đã sử dụng
│ ├── casbin.php Cấu hình casbin
......
├── database Tệp cơ sở dữ liệu
│ ├── migrations Tệp di chuyển
│ │ └── 20210218074218_create_rule_table.php
......
Tệp di chuyển cơ sở dữ liệu
<?php
use Phinx\Migration\AbstractMigration;
class CreateRuleTable extends AbstractMigration
{
/**
* Phương thức Change.
*
* Viết các di chuyển có thể đảo ngược của bạn bằng phương thức này.
*
* Thông tin thêm về việc viết các di chuyển có thể có ở đây:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* Các lệnh sau có thể được sử dụng trong phương thức này và Phinx sẽ
* tự động đảo ngược chúng khi hoàn tác:
*
* createTable
* renameTable
* addColumn
* addCustomColumn
* renameColumn
* addIndex
* addForeignKey
*
* Các thay đổi phá hủy khác sẽ dẫn đến lỗi khi cố gắng
* hoàn tác di chuyển.
*
* Nhớ gọi "create()" hoặc "update()" và KHÔNG phải "save()" khi làm việc
* với lớp Table.
*/
public function change()
{
$table = $this->table('rule', ['id' => false, 'primary_key' => ['id'], 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'Bảng quy tắc']);
// Thêm các trường dữ liệu
$table->addColumn('id', 'integer', ['identity' => true, 'signed' => false, 'limit' => 11, 'comment' => 'ID khóa chính'])
->addColumn('ptype', 'char', ['default' => '', 'limit' => 8, 'comment' => 'Loại quy tắc'])
->addColumn('v0', 'string', ['default' => '', 'limit' => 128])
->addColumn('v1', 'string', ['default' => '', 'limit' => 128])
->addColumn('v2', 'string', ['default' => '', 'limit' => 128])
->addColumn('v3', 'string', ['default' => '', 'limit' => 128])
->addColumn('v4', 'string', ['default' => '', 'limit' => 128])
->addColumn('v5', 'string', ['default' => '', 'limit' => 128]);
// Thực hiện tạo bảng
$table->create();
}
}
Cấu hình casbin
Cú pháp cấu hình mô hình quy tắc quyền xem tại: https://casbin.org/docs/zh-CN/syntax-for-models
<?php
return [
'default' => [
'model' => [
'config_type' => 'file',
'config_file_path' => config_path() . '/casbin-restful-model.conf', // Tệp cấu hình mô hình quy tắc quyền
'config_text' => '',
],
'adapter' => [
'type' => 'model', // model hoặc adapter
'class' => \app\model\Rule::class,
],
],
// Có thể cấu hình nhiều mô hình quyền khác nhau
'rbac' => [
'model' => [
'config_type' => 'file',
'config_file_path' => config_path() . '/casbin-rbac-model.conf', // Tệp cấu hình mô hình quy tắc quyền
'config_text' => '',
],
'adapter' => [
'type' => 'model', // model hoặc adapter
'class' => \app\model\RBACRule::class,
],
],
];
Bộ điều hợp
Bộ điều hợp hiện tại trong bao bọc composer tích hợp phương thức model của think-orm, các ORM khác vui lòng tham khảo vendor/teamones/src/adapters/DatabaseAdapter.php
Sau đó thay đổi cấu hình
return [
'default' => [
'model' => [
'config_type' => 'file',
'config_file_path' => config_path() . '/casbin-restful-model.conf', // Tệp cấu hình mô hình quy tắc quyền
'config_text' => '',
],
'adapter' => [
'type' => 'adapter', // Thay đổi loại này sang chế độ bộ điều hợp
'class' => \app\adapter\DatabaseAdapter::class,
],
],
];
Hướng dẫn sử dụng
Nhập
# Nhập
use teamones\casbin\Enforcer;
Hai cách sử dụng
# 1. Sử dụng cấu hình mặc định
Enforcer::addPermissionForUser('user1', '/user', 'read');
# 1. Sử dụng cấu hình rbac tùy chỉnh
Enforcer::instance('rbac')->addPermissionForUser('user1', '/user', 'read');
Giới thiệu về các API thường dùng
Để biết thêm cách sử dụng API, vui lòng tham khảo tài liệu chính thức
- API quản lý: https://casbin.org/docs/zh-CN/management-api
- API RBAC: https://casbin.org/docs/zh-CN/rbac-api
# Thêm quyền cho người dùng
Enforcer::addPermissionForUser('user1', '/user', 'read');
# Xóa quyền của một người dùng
Enforcer::deletePermissionForUser('user1', '/user', 'read');
# Lấy tất cả quyền của người dùng
Enforcer::getPermissionsForUser('user1');
# Thêm vai trò cho người dùng
Enforcer::addRoleForUser('user1', 'role1');
# Thêm quyền cho vai trò
Enforcer::addPermissionForUser('role1', '/user', 'edit');
# Lấy tất cả vai trò
Enforcer::getAllRoles();
# Lấy tất cả vai trò của người dùng
Enforcer::getRolesForUser('user1');
# Lấy người dùng theo vai trò
Enforcer::getUsersForRole('role1');
# Kiểm tra người dùng có thuộc vai trò nào không
Enforcer::hasRoleForUser('use1', 'role1');
# Xóa vai trò của người dùng
Enforcer::deleteRoleForUser('use1', 'role1');
# Xóa tất cả vai trò của người dùng
Enforcer::deleteRolesForUser('use1');
# Xóa vai trò
Enforcer::deleteRole('role1');
# Xóa quyền
Enforcer::deletePermission('/user', 'read');
# Xóa tất cả quyền của người dùng hoặc vai trò
Enforcer::deletePermissionsForUser('user1');
Enforcer::deletePermissionsForUser('role1');
# Kiểm tra quyền, trả về true hoặc false
Enforcer::enforce("user1", "/user", "edit");