Maison > cadre php > PensezPHP > Comment utiliser ThinkPHP6 pour implémenter la gestion des autorisations des rôles utilisateur

Comment utiliser ThinkPHP6 pour implémenter la gestion des autorisations des rôles utilisateur

WBOY
Libérer: 2023-06-20 22:06:27
original
1575 Les gens l'ont consulté

Avec le développement continu des affaires, de nombreuses petites et moyennes entreprises disposent de leurs propres systèmes de maintenance des utilisateurs, et la gestion des droits des utilisateurs en est une partie importante. Afin de protéger les informations sensibles dans le système et d'assurer le fonctionnement normal de l'entreprise, nous devons utiliser un mécanisme de gestion des autorisations de rôle pour garantir que les utilisateurs occupant différents rôles ne peuvent accéder qu'aux ressources et données désignées.

Cet article prendra le framework ThinkPHP6 comme exemple pour présenter comment utiliser le middleware de contrôle des autorisations et les packages d'extension qu'il fournit pour implémenter la gestion des autorisations des rôles utilisateur.

  1. Créer une table de rôles et une table d'autorisations

Nous devons d'abord définir deux tables de base de données, l'une est la table des rôles, utilisée pour stocker le rôle du système informations ;L'autre est la table d'autorisation, utilisée pour stocker les informations d'autorisation du système.

CREATE TABLE role (role (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(20) NOT NULL COMMENT '角色名称',
description varchar(50) NOT NULL COMMENT '角色描述',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

CREATE TABLE permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(20) NOT NULL COMMENT '权限名称',
description varchar(50) NOT NULL COMMENT '权限描述',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表';

我们可以使用ThinkPHP提供的数据库迁移工具来创建表:php think migrate:run。

  1. 创建角色和权限模型

接下来,我们需要创建角色和权限的模型。在app/model目录下创建Role.php和Permission.php文件,代码如下:

namespace appmodel;

use thinkModel;

class Role extends Model
{

protected $table = 'role';
Copier après la connexion

}

namespace appmodel;

use thinkModel;

class Permission extends Model
{

protected $table = 'permission';
Copier après la connexion

}

  1. 创建角色和权限关联表

由于一个用户可能拥有多个角色,一个角色也可能对应多个权限,所以我们需要创建一个角色和权限的关联表。在数据库中创建一个role_permission表。

CREATE TABLE role_permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
role_id int(11) NOT NULL COMMENT '角色ID',
permission_id int(11) NOT NULL COMMENT '权限ID',
PRIMARY KEY (id),
KEY role_id (role_id),
KEY permission_id (permission_id id int(11) NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',
nom varchar(20) NON NULL COMMENTAIRE 'Nom du rôle',

description varchar(50) NON NULL COMMENTAIRE 'Description du rôle',

CLÉ PRIMAIRE (< code >id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='role table';


CREATE TABLE permission (

< code>id int(11) NOT NULL AUTO_INCREMENT COMMENT 'Clé primaire',

name varchar(20) NOT NULL COMMENT 'Nom de l'autorisation',

< code> description varchar(50) NOT NULL COMMENT 'Description de l'autorisation',

PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=' Table des autorisations ';

Nous pouvons utiliser l'outil de migration de base de données fourni par ThinkPHP pour créer la table : php think migrate:run.

    Créer des modèles de rôles et d'autorisations

    Ensuite, nous devons créer des modèles de rôles et d'autorisations. Créez les fichiers Role.php et Permission.php dans le répertoire app/model. Le code est le suivant :

    namespace appmodel;

    . utiliser thinkModel;# 🎜🎜#

    class Role extends Model
      {
    1. protected $table = 'role';
      
      public function permissions()
      {
          return $this->belongsToMany(
              Permission::class,
              'role_permission',
              'role_id',
              'permission_id'
          );
      }
      Copier après la connexion
    2. }

    namespace appmodel;# 🎜🎜## 🎜🎜#use thinkModel;


    class Permission extends Model

    {

    protected $table = 'permission';
    
    public function roles()
    {
        return $this->belongsToMany(
            Role::class,
            'role_permission',
            'permission_id',
            'role_id'
        );
    }
    Copier après la connexion

    }
      # 🎜🎜#Créer une table d'association de rôles et d'autorisations


      Puisqu'un utilisateur peut avoir plusieurs rôles et qu'un rôle peut également correspondre à plusieurs autorisations, nous devons créer une table d'association de rôles et d'autorisations . Créez une table role_permission dans la base de données.

      CREATE TABLE role_permission (

      id int(11) NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',

      role_id int(11) NON NULL COMMENTAIRE 'ID de rôle',

      permission_id int(11) NON NULL COMMENTAIRE 'ID d'autorisation',
        CLÉ PRIMAIRE (< code >id),
      1. CLÉ role_id (role_id),
      2. CLÉ permission_id ( permission_id )
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Table d'association rôle-permission';

      Définir la relation plusieurs-à-plusieurs entre les rôles et les autorisations dans le model : #🎜 🎜#

      namespace appmodel;

      use thinkModel;

      class Role extends Model

      {# 🎜🎜#
      public function handle($request, Closure $next)
      {
          if (Session::has('user')) {
              $roles = Db::table('user')
                  ->alias('u')
                  ->leftJoin('role_user ru', 'u.id = ru.user_id')
                  ->leftJoin('role r', 'ru.role_id = r.id')
                  ->where('u.id', '=', Session::get('user')->id)
                  ->field('r.id')
                  ->select();
              $permissions = Config::get('permissions');
              foreach ($roles as $role) {
                  $rolePermissions = Db::table('role_permission')
                      ->where('role_id', '=', $role->id)
                      ->field('permission_id')
                      ->select();
                  foreach ($rolePermissions as $rolePermission) {
                      if (in_array($rolePermission->permission_id, $permissions)) {
                          return $next($request);
                      }
                  }
              }
          }
          abort(403, '没有权限');
      }
      Copier après la connexion
        }
      1. namespace appmodel;

        use thinkModel;


        class L'autorisation s'étend Model#🎜🎜 #{

        1 => 'user.create',
        2 => 'user.read',
        3 => 'user.update',
        4 => 'user.delete',
        Copier après la connexion

        }

        Define middleware

        Dans ThinkPHP6, le middleware est un outil puissant pour les outils de traitement des demandes, nous pouvons implémenter un contrôle des autorisations via un middleware. Créez un middleware CheckAuth pour déterminer si l'utilisateur est autorisé à effectuer l'opération en cours. Créez le fichier CheckAuth.php dans le répertoire appmiddleware avec le code suivant :

        namespace appmiddleware;

        use think acadeDb;
        use think acadeSession;

        use think acadeConfig;

        class CheckAuth

        {

        // ...
        'check_auth' => appmiddlewareCheckAuth::class,
        Copier après la connexion
        #🎜🎜#}#🎜🎜##🎜🎜#Le middleware interrogera d'abord le courant Pour tous les rôles détenus par l'utilisateur, lors du parcours des rôles, interrogez les autorisations détenues par chaque rôle. S'il existe des autorisations qui correspondent à la demande actuelle, l'exécution est autorisée à continuer, sinon une erreur 403 est renvoyée. #🎜🎜##🎜🎜##🎜🎜#Créer un fichier de configuration des autorisations#🎜🎜##🎜🎜##🎜🎜#Afin de faciliter la gestion des autorisations système, nous pouvons utiliser la fonction Config fournie par ThinkPHP pour écrire tout autorisations dans le fichier de configuration. Créez un fichier permissions.php dans le répertoire config avec le code suivant : #🎜🎜##🎜🎜#
        public function create()
        {
            $this->middleware('check_auth');
            // ...
        }
        Copier après la connexion
#🎜🎜#];#🎜🎜##🎜 🎜 #Nous pouvons enregistrer toutes les autorisations du système sous forme de clé/valeur. La clé est un entier et la valeur est une chaîne, indiquant le nom de l'autorisation. #🎜🎜##🎜🎜##🎜🎜#Apply Middleware#🎜🎜##🎜🎜##🎜🎜#Enfin, nous devons réellement appliquer le middleware ci-dessus. Ouvrez le fichier middleware.php dans le répertoire de configuration et ajoutez le middleware CheckAuth. #🎜🎜##🎜🎜#Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal