Lors de l'élaboration d'un système de gestion de fond ou d'un module de gestion de l'autorisation, le contrôle de l'autorisation est généralement une partie indispensable. Un scénario typique est qu'il existe un ensemble complet d'autorisations dans le système, et chaque utilisateur ne bénéficie qu'une partie des autorisations. Afin de filtrer efficacement les autorisations que les utilisateurs n'ont pas avant de présenter l'interface ou d'exécuter des fonctions, nous avons besoin d'une méthode précise et efficace de filtrage d'autorisation. La fonction array_diff_ukey () fournie par PHP peut implémenter ce filtrage d'autorisation dans certains scénarios.
Cet article utilisera un exemple pratique pour démontrer comment implémenter efficacement le filtrage d'autorisation utilisateur à l'aide d'Array_Diff_ukey () .
Supposons que le système définisse un ensemble complet d'autorisations:
$allPermissions = [
'user.view' => 'Afficher les utilisateurs',
'user.edit' => 'Modifier l'utilisateur',
'post.view' => 'Voir l'article',
'post.edit' => 'Modifier l'article',
'admin.panel' => 'Visitez l'arrière-plan',
];
Les autorisations d'un utilisateur ordinaire sont les suivantes:
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
Nous voulons obtenir une liste des autorisations que l'utilisateur ne possède pas pour des fonctions telles que la journalisation, la vérification de la sécurité ou les invites d'autorisation.
La fonction de la fonction array_diff_ukey () consiste à comparer les noms de clés de deux tableaux et à utiliser la fonction de rappel pour la comparaison personnalisée et à retourner les paires de valeurs clés qui existent dans le premier tableau mais pas dans d'autres tableaux .
Nous pouvons l'utiliser pour obtenir des autorisations que l'utilisateur ne possède pas dans $ AllperMissions :
$diff = array_diff_ukey(
$allPermissions,
$userPermissions,
function($key1, $key2) {
return strcmp($key1, $key2);
}
);
Dans le code ci-dessus, $ Diff renvoie un tableau contenant des autorisations qui ne sont pas détenues par tous les utilisateurs:
[
'user.edit' => 'Modifier l'utilisateur',
'post.edit' => 'Modifier l'article',
'admin.panel' => 'Visitez l'arrière-plan',
]
Imaginez que nous avons une page de configuration d'autorisation qui montre à l'administrateur les autorisations manquantes des éléments d'un certain utilisateur pour les ajustements. Nous pouvons faire ceci:
function getMissingPermissions(array $allPermissions, array $userPermissions): array {
return array_diff_ukey(
$allPermissions,
$userPermissions,
fn($a, $b) => strcmp($a, $b)
);
}
// Toutes les autorisations
$allPermissions = [
'user.view' => 'Afficher les utilisateurs',
'user.edit' => 'Modifier l'utilisateur',
'post.view' => 'Voir l'article',
'post.edit' => 'Modifier l'article',
'admin.panel' => 'Visitez l'arrière-plan',
];
// Autorisation appartenant à l'utilisateur
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
// Obtenir des autorisations manquantes
$missing = getMissingPermissions($allPermissions, $userPermissions);
// Résultat de sortie
foreach ($missing as $code => $desc) {
echo "Autorisations manquantes: $desc ($code)" . PHP_EOL;
}
Le résultat de la sortie est:
Autorisations manquantes: Modifier l'utilisateur (user.edit)
Autorisations manquantes: Modifier l'article (post.edit)
Autorisations manquantes: Visitez l'arrière-plan (admin.panel)
Système d'audit d'autorisation : Trouvez rapidement les éléments manquants lors de l'examen de la configuration de l'autorisation de l'utilisateur.
Journalisation de la différence : enregistrez les différences avant et après les modifications de l'autorisation de l'utilisateur.
Filtrage de l'arborescence de l'autorisation frontale : création dynamique des éléments de fonction non autorisés par l'utilisateur pour le traitement frontal.
Vérification de l'autorisation URL : intégrer le contrôle d'accès avec l'identification de l'autorisation de routage. Par exemple:
$permissions = [
'/dashboard' => 'Accéder au tableau de bord',
'/admin/users' => 'Gérer les utilisateurs',
'/admin/settings' => 'Paramètres du système',
];
$userPermissions = [
'/dashboard' => true,
];
$unauthorized = array_diff_ukey($permissions, $userPermissions, 'strcmp');
foreach ($unauthorized as $url => $desc) {
echo "Les utilisateurs n'ont pas la permission d'accès: https://m66.net$url ($desc)" . PHP_EOL;
}
Sortir: