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.
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。
接下来,我们需要创建角色和权限的模型。在app/model目录下创建Role.php和Permission.php文件,代码如下:
namespace appmodel;
use thinkModel;
class Role extends Model
{
protected $table = 'role';
}
namespace appmodel;
use thinkModel;
class Permission extends Model
{
protected $table = 'permission';
}
由于一个用户可能拥有多个角色,一个角色也可能对应多个权限,所以我们需要创建一个角色和权限的关联表。在数据库中创建一个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
(
name
varchar(20) NOT NULL COMMENT 'Nom 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 Modelprotected $table = 'role'; public function permissions() { return $this->belongsToMany( Permission::class, 'role_permission', 'role_id', 'permission_id' ); }
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' ); }
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',role_id
(role_id
),permission_id
( permission_id
)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, '没有权限'); }
class L'autorisation s'étend Model#🎜🎜 #{
1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',
}
Define middlewareDans 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 :
use think acadeDb;
use think acadeSession;
{
// ... 'check_auth' => appmiddlewareCheckAuth::class,
public function create() { $this->middleware('check_auth'); // ... }