web-dev-qa-db-fra.com

Clarification sur auth_redirect ()

En essayant de sécuriser certaines pages redirigeant les utilisateurs non insérés dans la page de connexion, j'ai trouvé auth_redirect() function here

Docs dit "Vérifie que l'utilisateur est connecté,si ce n'est pas le casil les redirige vers la page de connexion".

Maintenant, si oui, pourquoi dois-je prévoir if(!is_user_logged_in()) pour que la fonction fonctionne? Cela ne devrait pas être nécessaire, mais si je l’oublie, je serai redirigé pour toujours.

Quelle est la bonne façon d'utiliser cette fonction?

4
Mark

La réponse nécessite un peu de WP forensics car cette fonction est disponible dans WordPress depuis la version 1.5, mais a subi quelques modifications au fil du temps. Une chose qui n’a cependant pas changé est la description "Vérifie si un utilisateur est connecté, sinon, il les redirigera vers la page de connexion".

Je pense que techniquement c'est supposé. Et dans son itération d'origine, il l'a fait.

Cependant, une mauvaise logique conditionnelle a été introduite, ce qui empêche ce fonctionnement. Dans la version actuelle de WP (4.1.1), le problème (ou l’un d’eux) est la suivante:

if ( $user_id = wp_validate_auth_cookie( '',  $scheme) ) {

Cette logique de comparaison ne fonctionne pas à cause du simple "=". Ce qu'il est censé faire est de comparer le $ user_id à la valeur renvoyée de wp_validate_auth_cookie (), qui, si l'utilisateur est connecté, retournera un ID utilisateur.

Mais ce n'est pas aussi simple que de simplement fixer la logique. Si vous regardez la fonction, $ user_id n'est pas défini. Je soupçonne que cela devrait être une variable globale, mais je ne suis pas certain.

J'ai parcouru l'historique de cette fonction pour voir quand ce problème a été introduit et découvert que c'était dans la version 2.7. Cela pose donc un problème avec la fonction depuis plusieurs années. Avant ce changement, la logique testait simplement une valeur valide (non fausse) renvoyée par wp_validate_auth_cookie () plutôt que de comparer cette valeur à ce qui devrait être l'ID utilisateur de l'utilisateur connecté.

Je pense que résoudre la logique de comparaison et ajouter le global $ user_id peut être la solution pour corriger les problèmes de la fonction. Je vais tester cela et le soumettre comme solution proposée.

2
butlerblog