Casbin

Giới thiệu

Casbin là một framework quản lý truy cập nguồn mở mạnh mẽ và hiệu quả, cơ chế quản lý quyền hỗ trợ nhiều mô hình kiểm soát truy cập.

Địa chỉ dự án

https://github.com/teamones-open/casbin

Cài đặt

composer require teamones/casbin

Trang chủ của Casbin

Bạn có thể xem chi tiết sử dụng tại trang chủ thông qua tài liệu tiếng Trung, ở đây chỉ giải thích 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 tin cấu hình mô hình quyền hạn được sử dụng
│   ├── casbin.php                Cấu hình casbin
......
├── database                      Tệp cơ sở dữ liệu
│   ├── migrations                Tệp di cư
│   │   └── 20210218074218_create_rule_table.php
......

Tệp di cư cơ sở dữ liệu

<?php

use Phinx\Migration\AbstractMigration;

class CreateRuleTable extends AbstractMigration
{
    /**
     * Phương thức Thay đổi.
     *
     * Viết các di cư có thể hoán đổi của bạn bằng phương pháp này.
     *
     * Thêm thông tin về viết di cư có sẵn tại đâ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 pháp này và Phinx sẽ
     * tự động hoán đổi chúng khi quay trở lại:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    addCustomColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Mọi thay đổi phá hủy khác sẽ dẫn đến lỗi khi cố gắng
     * quay trở lại di cư.
     *
     * Nhớ gọi "create()" hoặc "update()" và KHÔNG PHẢI "save()" khi làm việc
     * với class Bảng.
     */
    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ột dữ liệu
        $table->addColumn('id', 'integer', ['identity' => true, 'signed' => false, 'limit' => 11, 'comment' => 'ID 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
        $table->create();
    }
}

Cấu hình casbin

Về cú pháp cấu hình mô hình quyền hạn, vui lòng 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 tin cấu hình mô hình quyền hạn
            'config_text' => '',
        ],
        'adapter' => [
            'type' => 'model', // model hoặc adapter
            'class' => \app\model\Rule::class,
        ],
    ],
    // Bạn có thể cấu hình nhiều mô hình quyền hạn
    'rbac' => [
        'model' => [
            'config_type' => 'file',
            'config_file_path' => config_path() . '/casbin-rbac-model.conf', // Tập tin cấu hình mô hình quyền hạn
            'config_text' => '',
        ],
        'adapter' => [
            'type' => 'model', // model hoặc adapter
            'class' => \app\model\RBACRule::class,
        ],
    ],
];

Adapter

Gói Composer hiện tại hỗ trợ phương thức model của think-orm, cho các orm khác, vui lòng xem tại vendor/teamones/src/adapters/DatabaseAdapter.php

Sau đó, chỉnh sửa cấu hình

return [
    'default' => [
        'model' => [
            'config_type' => 'file',
            'config_file_path' => config_path() . '/casbin-restful-model.conf', // Tập tin cấu hình mô hình quyền hạn
            'config_text' => '',
        ],
        'adapter' => [
            'type' => 'adapter', // Ở đây loại được cấu hình thành chế độ Adapter
            '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');

# 2. Sử dụng cấu hình rbac tùy chỉnh
Enforcer::instance('rbac')->addPermissionForUser('user1', '/user', 'read');

Giới thiệu API phổ biến

Để biết thêm về cách sử dụng API, vui lòng xem tại trang chính thức

# Thêm quyền cho người dùng

Enforcer::addPermissionForUser('user1', '/user', 'read');

# Xóa quyền của 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 dựa trên vai trò

Enforcer::getUsersForRole('role1');

# Kiểm tra xem người dùng có thuộc một vai trò 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");