Maison  >  Article  >  cadre php  >  Guide de gestion des autorisations ThinkPHP6 : implémentation du contrôle des autorisations des utilisateurs

Guide de gestion des autorisations ThinkPHP6 : implémentation du contrôle des autorisations des utilisateurs

王林
王林original
2023-08-13 18:09:072086parcourir

Guide de gestion des autorisations ThinkPHP6 : implémentation du contrôle des autorisations des utilisateurs

Guide de gestion des autorisations ThinkPHP6 : Implémentation du contrôle des autorisations des utilisateurs

Introduction :
Dans les applications Web, la gestion des autorisations est un élément très important. Elle peut nous aider à contrôler les autorisations d'accès et de fonctionnement des utilisateurs aux ressources système et à protéger la sécurité du système. . Dans le framework ThinkPHP6, nous pouvons utiliser ses puissantes fonctions de gestion des autorisations pour implémenter le contrôle des autorisations des utilisateurs.

1. Créer une table de base de données
Avant de commencer à implémenter le contrôle des autorisations des utilisateurs, nous devons d'abord créer la table de base de données correspondante pour stocker les informations sur les utilisateurs, les rôles et les autorisations. Voici l'instruction SQL pour créer la table :

  1. Table utilisateur (utilisateur) :
    CREATE TABLE user (user (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    username varchar(50) NOT NULL COMMENT '用户名',
    password char(32) NOT NULL COMMENT '密码',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
  2. 角色表(role):
    CREATE TABLE role (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID',
    name varchar(50) NOT NULL COMMENT '角色名称',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
  3. 权限表(permission):
    CREATE TABLE permission (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
    name varchar(50) NOT NULL COMMENT '权限名称',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表';
  4. 用户-角色关联表(user_role):
    CREATE TABLE user_role (
    user_id int(11) unsigned NOT NULL COMMENT '用户ID',
    role_id int(11) unsigned NOT NULL COMMENT '角色ID',
    PRIMARY KEY (user_id,role_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户-角色关联表';
  5. 角色-权限关联表(role_permission):
    CREATE TABLE role_permission (
    role_id int(11) unsigned NOT NULL COMMENT '角色ID',
    permission_id int(11) unsigned NOT NULL COMMENT '权限ID',
    PRIMARY KEY (role_id,permission_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色-权限关联表';

二、定义模型关联
在ThinkPHP6中,我们可以使用模型关联来建立用户、角色和权限之间的关系。以下是相应的模型定义:

  1. 用户模型(User.php):
    namespace appmodel;

use thinkModel;

class User extends Model
{

// 用户-角色关联
public function roles()
{
    return $this->belongsToMany(Role::class, 'user_role');
}

}

  1. 角色模型(Role.php):
    namespace appmodel;

use thinkModel;

class Role extends Model
{

// 角色-权限关联
public function permissions()
{
    return $this->belongsToMany(Permission::class, 'role_permission');
}

}

  1. 权限模型(Permission.php):
    namespace appmodel;

use thinkModel;

class Permission extends Model
{

// 权限-角色关联
public function roles()
{
    return $this->belongsToMany(Role::class, 'role_permission');
}

}

三、定义权限中间件
在ThinkPHP6中,我们可以使用中间件来统一处理用户权限的验证。以下是一个简单的权限中间件定义示例:

  1. 创建中间件类:
    namespace appmiddleware;

use appmodelPermission;
use thinkacadeRequest;
use thinkacadeSession;
use thinkResponse;

class AuthMiddleware
{

public function handle(Request $request, Closure $next)
{
    // 获取当前请求的URL
    $url = $request->baseUrl();

    // 获取当前用户的角色信息
    $roles = Session::get('user.roles');

    // 获取当前角色拥有的权限
    $permissions = [];
    foreach ($roles as $role) {
        $rolePermissions = Permission::whereHas('roles', function ($query) use ($role) {
            $query->where('role_id', $role['id']);
        })->select();
        $permissions = array_merge($permissions, $rolePermissions->toArray());
    }

    // 验证权限
    foreach ($permissions as $permission) {
        if ($permission['name'] == $url) {
            return $next($request);
        }
    }

    // 没有权限,跳转到无权限页面
    return Response::create('您没有权限访问该页面!', 'html', 403);
}

}

  1. 注册中间件:
    我们可以将权限中间件注册到应用的中间件配置文件(middleware.php)中,如下所示:
    return [
    // ...
    ppmiddlewareAuthMiddleware::class,
    // ...
    ];

四、应用权限中间件
我们可以通过在路由定义中使用中间件来应用权限验证。以下是一个示例路由定义:

use thinkacadeRoute;

Route::group('admin', function () {

// 需要验证权限的页面
Route::rule('user/index', 'admin/user/index')
    ->middleware('AuthMiddleware');
// ...
// 其他路由定义
// ...

})->middleware('AuthMiddleware');

在上述示例中,我们通过使用middleware('AuthMiddleware') id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID utilisateur',

nom d'utilisateur varchar(50) NON NULL COMMENTAIRE 'nom d'utilisateur',

mot de passe char(32) NON NULL COMMENTAIRE 'mot de passe',
CLÉ PRIMAIRE ( id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Table utilisateur';🎜Table de rôles (role):🎜CREATE TABLE role (🎜 id int(11) non signé NON NULL AUTO_INCREMENT COMMENT 'ID de rôle',🎜 name varchar(50) NOT NULL COMMENT 'nom de rôle',🎜 CLÉ PRIMAIRE (id)🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='role table';🎜Permission table (permission) : 🎜CREATE TABLE <code>permission (🎜 id code> int(11) non signé NOT NULL AUTO_INCREMENT COMMENT 'ID d'autorisation',🎜 <code>name varchar(50) NOT NULL COMMENT 'Nom d'autorisation',🎜 CLÉ PRIMAIRE (id) 🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Table des autorisations';🎜Table d'association utilisateur-rôle (user_role) : 🎜CREATE TABLE user_role (🎜 user_id int (11) COMMENTAIRE NON NULL non signé 'ID utilisateur',🎜 role_id int (11) COMMENTAIRE NON NULL non signé 'ID de rôle',🎜 CLÉ PRIMAIRE (id_utilisateur, role_id)🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Table d'association de rôle utilisateur';🎜Table d'association de rôle-permission (role_permission) : 🎜CREATE TABLE role_permission code> (🎜 <code>role_id int(11) non signé NOT NULL COMMENT 'role ID',🎜 permission_id int(11) non signé NOT NULL COMMENT 'permission ID',🎜 PRIMARY KEY (role_id,permission_id)🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Table d'association rôle-permission';🎜2. association de modèles 🎜Dans ThinkPHP6, nous pouvons utiliser l'association de modèles pour établir la relation entre les utilisateurs, les rôles et les autorisations. Voici la définition du modèle correspondant : 🎜🎜🎜Modèle utilisateur (User.php): 🎜namespace appmodel; 🎜use thinkModel 🎜🎜class User extends Model 🎜{🎜rrreee🎜}🎜
    🎜Role Model (Role.php) : 🎜namespace appmodel;
🎜use thinkModel;🎜🎜class Role extends Model🎜{🎜rrreee🎜}🎜
    🎜Modèle d'autorisation (Permission.php) : 🎜modèle d'application d'espace de noms ;
🎜utilisez thinkModel;🎜🎜class Permission extends Model🎜{🎜rrreee🎜}🎜🎜3. Définissez le middleware d'autorisation🎜dans ThinkPHP6, nous pouvons utiliser un middleware pour gérer uniformément la vérification des autorisations des utilisateurs. Voici un exemple de définition simple d'un middleware d'autorisation : 🎜🎜🎜Créez une classe middleware : 🎜namespace appmiddleware;🎜utilisez appmodelPermission;🎜utilisez think acadeRequest;🎜utilisez think acadeSession;🎜utilisez thinkResponse; 🎜 🎜class AuthMiddleware🎜{🎜rrreee🎜}🎜
    🎜Enregistrer le middleware : 🎜Nous pouvons enregistrer le middleware d'autorisation dans le fichier de configuration du middleware de l'application (middleware.php) comme suit : 🎜 return [🎜 / / ...🎜 ppmiddlewareAuthMiddleware::class,🎜 // ...🎜];
🎜Quatre. Middleware d'autorisation d'application🎜Nous pouvons utiliser un middleware dans les définitions de routes pour appliquer la vérification des autorisations. Voici un exemple de définition d'itinéraire : 🎜🎜use think acadeRoute;🎜🎜Route::group('admin', function () {🎜rrreee🎜})->middleware('AuthMiddleware');🎜🎜Dans l'exemple ci-dessus, Nous utilisons la méthode middleware('AuthMiddleware') pour appliquer un middleware d'autorisation afin de vérifier et de contrôler les autorisations des utilisateurs. 🎜🎜Conclusion : 🎜Grâce aux étapes ci-dessus, nous pouvons réaliser la gestion et le contrôle des autorisations des utilisateurs dans le framework ThinkPHP6. Grâce à l'association de modèles et au middleware, nous pouvons facilement réaliser la relation entre les utilisateurs, les rôles et les autorisations, et utiliser un middleware pour effectuer la vérification des autorisations, ainsi que l'interception et le traitement lorsque les utilisateurs accèdent à des pages restreintes. Cela peut protéger efficacement la sécurité des ressources du système et fournir au système de meilleures fonctions de contrôle des autorisations des utilisateurs. 🎜

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!

Déclaration:
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