Bei der Entwicklung eines Hintergrundverwaltungssystems oder eines Berechtigungsverwaltungsmoduls ist die Berechtigungssteuerung normalerweise ein unverzichtbarer Teil. Ein typisches Szenario ist, dass das System eine vollständige Anzahl von Berechtigungen vorliegt und jedem Benutzer nur einen Teil der Berechtigungen erteilt wird. Um die Berechtigungen effektiv herauszufiltern, die Benutzer vor der Präsentation der Schnittstelle oder der Ausführung von Funktionen nicht haben, benötigen wir eine genaue und effiziente Methode für die Berechtigungsfilterung. Die von PHP bereitgestellte Funktion array_diff_ukey () kann diese Berechtigungsfilterung in einigen Szenarien implementieren.
In diesem Artikel wird ein praktisches Beispiel verwendet, um zu demonstrieren, wie die Benutzerberechtigungsfilterung mit Array_Diff_Ukey () effizient implementiert werden kann.
Angenommen, das System definiert einen vollständigen Satz von Berechtigungen:
$allPermissions = [
'user.view' => 'Benutzer anzeigen',
'user.edit' => 'Benutzer bearbeiten',
'post.view' => 'Den Artikel anzeigen',
'post.edit' => 'Bearbeiten Sie den Artikel',
'admin.panel' => 'Besuchen Sie den Hintergrund',
];
Die Berechtigungen eines gewöhnlichen Benutzers sind wie folgt:
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
Wir möchten eine Liste von Berechtigungen erhalten, die der Benutzer nicht für Funktionen wie Protokollierung, Sicherheitsüberprüfung oder Berechtigungsaufforderungen besitzt .
Die Funktion der Funktion array_diff_ukey () besteht darin , die Schlüsselnamen zweier Arrays zu vergleichen und die Rückruffunktion für benutzerdefinierten Vergleiche zu verwenden und Schlüsselwertpaare zurückzugeben, die im ersten Array, aber nicht in anderen Arrays vorhanden sind, vorhanden sind .
Wir können es verwenden, um Berechtigungen zu erhalten, die der Benutzer in $ allpermissions nicht besitzt:
$diff = array_diff_ukey(
$allPermissions,
$userPermissions,
function($key1, $key2) {
return strcmp($key1, $key2);
}
);
Im obigen Code gibt $ Diff ein Array zurück, das Berechtigungen enthält, die nicht allen Benutzern gehören:
[
'user.edit' => 'Benutzer bearbeiten',
'post.edit' => 'Bearbeiten Sie den Artikel',
'admin.panel' => 'Besuchen Sie den Hintergrund',
]
Stellen Sie sich vor, wir haben eine Berechtigungskonfigurationsseite, auf der der Administrator die Berechtigungen fehlenden Elementen eines bestimmten Benutzers für Anpassungen zeigt. Wir können das tun:
function getMissingPermissions(array $allPermissions, array $userPermissions): array {
return array_diff_ukey(
$allPermissions,
$userPermissions,
fn($a, $b) => strcmp($a, $b)
);
}
// Alle Berechtigungen
$allPermissions = [
'user.view' => 'Benutzer anzeigen',
'user.edit' => 'Benutzer bearbeiten',
'post.view' => 'Den Artikel anzeigen',
'post.edit' => 'Bearbeiten Sie den Artikel',
'admin.panel' => 'Besuchen Sie den Hintergrund',
];
// Berechtigungen des Benutzer
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
// Erhalten Sie fehlende Berechtigungen
$missing = getMissingPermissions($allPermissions, $userPermissions);
// Ausgangsergebnis
foreach ($missing as $code => $desc) {
echo "Fehlende Berechtigungen: $desc ($code)" . PHP_EOL;
}
Das Ausgangsergebnis ist:
Fehlende Berechtigungen: Benutzer bearbeiten (user.edit)
Fehlende Berechtigungen: Bearbeiten Sie den Artikel (post.edit)
Fehlende Berechtigungen: Besuchen Sie den Hintergrund (admin.panel)
Berechtigungsprüfungssystem : Finden Sie schnell fehlende Elemente bei der Überprüfung der Benutzerberechtigungskonfiguration.
Differenzprotokollierung : Notieren Sie die Unterschiede vor und nach Änderungen der Benutzerberechtigung.
Front-End-Berechtigungsbaumfilterung : Dynamisch erstellen Sie benutzerbefugte Funktionselemente für die Front-End-Verarbeitung.
URL -Berechtigungsüberprüfung : Integrieren Sie die Zugriffskontrolle in die Identifizierung von Routing -Berechtigungen. Zum Beispiel:
$permissions = [
'/dashboard' => 'Greifen Sie auf das Dashboard zu',
'/admin/users' => 'Benutzer verwalten',
'/admin/settings' => 'Systemeinstellungen',
];
$userPermissions = [
'/dashboard' => true,
];
$unauthorized = array_diff_ukey($permissions, $userPermissions, 'strcmp');
foreach ($unauthorized as $url => $desc) {
echo "Benutzer haben keine Erlaubnis zum Zugriff: https://m66.net$url ($desc)" . PHP_EOL;
}
Ausgabe: