Angesichts der kontinuierlichen Geschäftsentwicklung verfügen viele kleine und mittlere Unternehmen über eigene Benutzerverwaltungssysteme, und die Verwaltung von Benutzerrechten ist ein wichtiger Bestandteil davon. Um vertrauliche Informationen im System zu schützen und den normalen Geschäftsbetrieb sicherzustellen, müssen wir einen Rollenberechtigungsverwaltungsmechanismus verwenden, um sicherzustellen, dass Benutzer mit unterschiedlichen Rollen nur auf bestimmte Ressourcen und Daten zugreifen können.
In diesem Artikel wird das ThinkPHP6-Framework als Beispiel verwendet, um vorzustellen, wie die von ihm bereitgestellte Berechtigungskontroll-Middleware und Erweiterungspakete zur Implementierung der Benutzerrollen-Berechtigungsverwaltung verwendet werden.
Zuerst müssen wir zwei Datenbanktabellen definieren, eine ist die Rollentabelle, die zum Speichern von Systemrolleninformationen verwendet wird, und die andere ist die Berechtigungstabelle, die zum Speichern von Systemberechtigungsinformationen verwendet wird.
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 'primary key',
name
varchar(20) NOT NULL COMMENT 'Rollenname',
description
varchar(50) NOT NULL COMMENT 'Rollenbeschreibung', PRIMARY KEY (id
)
CREATE TABLE permission
(
id
int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key', name
varchar( 20) NOT NULL COMMENT 'Berechtigungsname',
description
varchar(50) NOT NULL COMMENT 'Berechtigungsbeschreibung', PRIMARY KEY (id
)
) ENGINE= InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Permission Table';
Wir können das von ThinkPHP bereitgestellte Datenbankmigrationstool verwenden, um die Tabelle zu erstellen: php think migrate:run.
Erstellen Sie Rollen- und Berechtigungsmodelle
Als nächstes müssen wir Rollen- und Berechtigungsmodelle erstellen. Erstellen Sie die Dateien Role.php und Permission.php im Verzeichnis app/model. Der Code lautet wie folgt:
namespace appmodel;
use thinkModel;
protected $table = 'role'; public function permissions() { return $this->belongsToMany( Permission::class, 'role_permission', 'role_id', 'permission_id' ); }
?< Wenn Sie mehrere Rollen haben, kann eine Rolle auch mehreren Berechtigungen entsprechen. Daher müssen wir eine Zuordnungstabelle für Rollen und Berechtigungen erstellen. Erstellen Sie eine Role_permission-Tabelle in der Datenbank.
CREATE TABLE role_permission
(
id
int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
role_id
int(11) NOT NULL KOMMENTAR 'Rollen-ID', permission_id
int(11) NICHT NULL KOMMENTAR 'Berechtigungs-ID',
PRIMÄRSCHLÜSSEL (id
),
SCHLÜSSEL role_id</code > (<code>role_id
),
permission_id
(permission_id
)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Rollen-Berechtigungs-Zuordnungstabelle' ;
protected $table = 'permission'; public function roles() { return $this->belongsToMany( Role::class, 'role_permission', 'permission_id', 'role_id' ); }
< ?php
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, '没有权限'); }
use think acadeDb;
use think acadeSession;use think acadeConfig;
{
1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',
}
Berechtigungskonfigurationsdatei erstellen
🎜🎜Um die Verwaltung von Systemberechtigungen zu erleichtern, können wir die von ThinkPHP bereitgestellte Konfigurationsfunktion verwenden, um alle Berechtigungen in die Konfigurationsdatei zu schreiben. Erstellen Sie eine Datei „permissions.php“ im Konfigurationsverzeichnis. Der Code lautet wie folgt: 🎜🎜// ... 'check_auth' => appmiddlewareCheckAuth::class,
public function create() { $this->middleware('check_auth'); // ... }