Casbin

Description

Casbin est un cadre de contrôle d'accès open-source puissant et efficace, dont le mécanisme de gestion des autorisations prend en charge plusieurs modèles de contrôle d'accès.

Adresse du projet

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

Installation

composer require teamones/casbin

Site officiel de Casbin

Pour des informations détaillées, vous pouvez consulter la documentation officielle en chinois, ici nous allons seulement expliquer comment le configurer et l'utiliser dans webman.

https://casbin.org/docs/zh-CN/overview

Structure du répertoire

.
├── config                        Répertoire de configuration
│   ├── casbin-restful-model.conf Fichier de configuration du modèle de permission utilisé
│   ├── casbin.php                Configuration de casbin
......
├── database                      Fichiers de base de données
│   ├── migrations                Fichiers de migration
│   │   └── 20210218074218_create_rule_table.php
......

Fichier de migration de base de données

<?php

use Phinx\Migration\AbstractMigration;

class CreateRuleTable extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Écrivez vos migrations réversibles en utilisant cette méthode.
     *
     * Plus d'informations sur l'écriture des migrations sont disponibles ici :
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * Les commandes suivantes peuvent être utilisées dans cette méthode et Phinx
     * les inversera automatiquement lors du retour en arrière :
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    addCustomColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Tous les autres changements destructeurs entraîneront une erreur lors de la
     * tentative de rollback de la migration.
     *
     * N'oubliez pas d'appeler "create()" ou "update()" et NON "save()" lorsque vous travaillez
     * avec la classe Table.
     */
    public function change()
    {
        $table = $this->table('rule', ['id' => false, 'primary_key' => ['id'], 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'Table des règles']);

        // Ajouter des champs de données
        $table->addColumn('id', 'integer', ['identity' => true, 'signed' => false, 'limit' => 11, 'comment' => 'ID principal'])
            ->addColumn('ptype', 'char', ['default' => '', 'limit' => 8, 'comment' => 'Type de règle'])
            ->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]);

        // Exécuter la création
        $table->create();
    }
}

Configuration de casbin

Pour la syntaxe de configuration du modèle de règles d'autorisation, consultez : 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', // Fichier de configuration du modèle de règles d'autorisation
            'config_text' => '',
        ],
        'adapter' => [
            'type' => 'model', // modèle ou adaptateur
            'class' => \app\model\Rule::class,
        ],
    ],
    // Plusieurs modèles de permissions peuvent être configurés
    'rbac' => [
        'model' => [
            'config_type' => 'file',
            'config_file_path' => config_path() . '/casbin-rbac-model.conf', // Fichier de configuration du modèle de règles d'autorisation
            'config_text' => '',
        ],
        'adapter' => [
            'type' => 'model', // modèle ou adaptateur
            'class' => \app\model\RBACRule::class,
        ],
    ],
];

Adaptateur

L'adaptateur dans le paquet composer actuel est basé sur la méthode model de think-orm, pour d'autres ORM, consultez vendor/teamones/src/adapters/DatabaseAdapter.php.

Puis modifiez la configuration.

return [
    'default' => [
        'model' => [
            'config_type' => 'file',
            'config_file_path' => config_path() . '/casbin-restful-model.conf', // Fichier de configuration du modèle de règles d'autorisation
            'config_text' => '',
        ],
        'adapter' => [
            'type' => 'adapter', // Configurez ici le type en mode adaptateur
            'class' => \app\adapter\DatabaseAdapter::class,
        ],
    ],
];

Instructions d'utilisation

Inclusion

# Inclusion
use teamones\casbin\Enforcer;

Deux façons d'utiliser

# 1. Utilisez par défaut la configuration par défaut
Enforcer::addPermissionForUser('user1', '/user', 'read');

# 1. Utilisez la configuration rbac personnalisée
Enforcer::instance('rbac')->addPermissionForUser('user1', '/user', 'read');

Introduction aux API courantes

Pour plus d'utilisations des API, veuillez consulter la documentation officielle.

# Ajouter une permission à un utilisateur

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

# Supprimer une permission d'un utilisateur

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

# Obtenir toutes les permissions d'un utilisateur

Enforcer::getPermissionsForUser('user1'); 

# Ajouter un rôle à un utilisateur

Enforcer::addRoleForUser('user1', 'role1');

# Ajouter une permission à un rôle

Enforcer::addPermissionForUser('role1', '/user', 'edit');

# Obtenir tous les rôles

Enforcer::getAllRoles();

# Obtenir tous les rôles d'un utilisateur

Enforcer::getRolesForUser('user1');

# Obtenir les utilisateurs d'un rôle

Enforcer::getUsersForRole('role1');

# Vérifier si un utilisateur appartient à un rôle

Enforcer::hasRoleForUser('use1', 'role1');

# Supprimer un rôle d'utilisateur

Enforcer::deleteRoleForUser('use1', 'role1');

# Supprimer tous les rôles d'un utilisateur

Enforcer::deleteRolesForUser('use1');

# Supprimer un rôle

Enforcer::deleteRole('role1');

# Supprimer une permission

Enforcer::deletePermission('/user', 'read');

# Supprimer toutes les permissions d'un utilisateur ou d'un rôle

Enforcer::deletePermissionsForUser('user1');
Enforcer::deletePermissionsForUser('role1');

# Vérifier la permission, retourne true ou false

Enforcer::enforce("user1", "/user", "edit");