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

# 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");