SQLite3::setAuthorizer
(PHP 8)
SQLite3::setAuthorizer — Configure une fonction de rappel à utiliser comme autorisateur pour limiter ce qu'une instruction peut faire
Description
public function SQLite3::setAuthorizer(
?callable $callback):
bool
La fonction de rappel de l'autorisateur peut être appelée plusieurs fois pour chaque instruction préparée par
SQLite. Une requête SELECT ou UPDATE appellera l'autorisateur pour chaque
colonne qui serait lue ou mise à jour.
La fonction de rappel de l'autorisateur est appelée avec jusqu'à cinq paramètres. Le premier paramètre est toujours
donné, et est un int (code d'action) correspondant à une constante de
SQLite3. Les autres paramètres ne sont passés que pour certaines actions. Le
tableau suivant décrit les deuxième et troisième paramètres en fonction de l'action :
Le quatrième paramètre sera le nom de la base de données ("main",
"temp", etc.) si applicable.
Le cinquième paramètre de la fonction de rappel de l'autorisateur est le nom du déclencheur ou de la vue le plus
interne qui est responsable de la tentative d'accès ou null si cette tentative d'accès est directement issue du
code SQL de niveau supérieur.
Lorsque la fonction de rappel retourne SQLite3::OK, cela signifie que l'opération
demandée est acceptée. Lorsque la fonction de rappel retourne SQLite3::DENY, l'appel qui a
déclenché l'autorisateur échouera avec un message d'erreur expliquant que
l'accès est refusé.
Si le code d'action est SQLite3::READ et que la fonction de rappel retourne
SQLite3::IGNORE, alors l'instruction préparée est construite pour substituer une valeur
null à la place de la colonne de la table qui aurait été lue si SQLite3::OK avait été retourné.
Le retour de SQLite3::IGNORE peut être utilisé pour refuser à un utilisateur non fiable l'accès
à des colonnes individuelles d'une table.
Lorsqu'une table est référencée par un SELECT mais aucune valeur de colonne n'est extraite de
cette table (par exemple dans une requête comme "SELECT count(*) FROM table"), alors la fonction
de rappel de l'autorisateur est invoquée une fois pour cette table avec un nom de colonne qui est une chaîne vide.
Si le code d'action est SQLite3::DELETE et que la fonction de rappel retourne
SQLite3::IGNORE, alors l'opération DELETE se poursuit mais l'optimisation de troncature est
désactivée et toutes les lignes sont supprimées individuellement.
Seul un seul autorisateur peut être en place sur une connexion de base de données à la fois. Chaque appel à
SQLite3::setAuthorizer() remplace l'appel précédent. Désactivez l'autorisateur en installant
un rappel null. L'autorisateur est désactivé par défaut.
La fonction de rappel de l'autorisateur ne doit pas faire quoi que ce soit qui modifiera la connexion de base de
données qui a invoqué la fonction de rappel de l'autorisateur.
Il est à noter que l'autorisateur n'est appelé que lorsqu'une instruction est préparée, pas lorsqu'elle est
exécutée.
Plus de détails peuvent être trouvés dans la
» documentation de SQLite3.
Liste de paramètres
callback
-
Le callable à appeler.
Si null est passé, cela désactivera le rappel de l'autorisateur actuel.
Valeurs de retour
Cette fonction retourne true en cas de succès ou false si une erreur survient.
Erreurs / Exceptions
Cette méthode ne lance aucune erreur, mais si un autorisateur est activé et retourne une
valeur invalide, la préparation de l'instruction lancera une erreur (ou une exception, selon
l'utilisation de la méthode SQLite3::enableExceptions()).
Exemples
Exemple #1 Exemple de SQLite3::setAuthorizer()
Ceci n'autorise que l'accès en lecture, et seules certaines colonnes de la table
users seront retournées. Les autres colonnes seront remplacées par
null.
<?php
$db = new SQLite3('data.sqlite');
$db->exec('CREATE TABLE users (id, name, password);');
$db->exec('INSERT INTO users VALUES (1, \'Pauline\', \'Snails4eva\');');
$allowed_columns = ['id', 'name'];
$db->setAuthorizer(function (int $action, ...$args) use ($allowed_columns) {
if ($action === SQLite3::READ) {
list($table, $column) = $args;
if ($table === 'users' && in_array($column, $allowed_columns)) {
return SQLite3::OK;
}
return SQLite3::IGNORE;
}
return SQLite3::DENY;
});
print_r($db->querySingle('SELECT * FROM users WHERE id = 1;'));
L'exemple ci-dessus va afficher :
Array
(
[id] => 1
[name] => Pauline
[password] =>
)