Maison  >  Article  >  développement back-end  >  Analyse du flux logique d'authentification rapide de Laravel5

Analyse du flux logique d'authentification rapide de Laravel5

不言
不言original
2018-07-04 15:42:501806parcourir

Cet article présente principalement l'analyse du processus logique d'authentification rapide de Laravel5. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Laravel5 lui-même est livré avec un ensemble d'utilisateurs. fonction d'authentification, utilisez simplement la ligne de commande php artisan make:auth et php artisan migrate就可以使用自带的快速认证功能。

sous un nouveau projet. Ce qui suit est une analyse logique de la fonction de connexion, qui est basée sur la version Laravel 5.5.

Obtenez la route de connexion (case rouge) via la commande php artisan route:list:

Ouvrir et afficher /app/Http/Controller/Auth/ LoginController.php , le code du fichier est très concis. En fait, la logique et les méthodes de connexion sont intégrées dans le trait de Illuminate/Foundation/Auth/AuthenticatesUsers :

Voir le. méthode de connexion du code IlluminateFoundationAuthAuthenticatesUsers, le paramètre $ request est l'objet de requête, y compris les informations de demande de connexion, y compris le nom de connexion, le mot de passe, etc. :

line31 : La méthode validateLogin est chargée d'appeler la méthode validate du contrôleur lui-même pour vérification. Il n'est pas nécessaire d'entrer dans les détails pour savoir si le nom d'utilisateur et le mot de passe sont conformes à des règles simples.

Il convient de noter la méthode du nom d'utilisateur marquée dans la case rouge. Les développeurs peuvent personnaliser cette méthode dans LoginController pour remplacer la méthode du trait et personnaliser le champ du compte de connexion par défaut. à « envoyer un e-mail ».

Ne modifiez pas directement la méthode username() du trait. Maintenez l'intégrité du framework Laravel5. La raison n'est pas expliquée en détail.

line36 : méthode hasTooManyLoginAttempts, utilisée pour vérifier si le nombre de tentatives de connexion au compte atteint la valeur maximale définie.

Cette méthode fait référence au trait d'IlluminateFoundationAuthThrottlesLogins. En regardant le nom du trait, vous pouvez deviner qu’il est chargé d’éviter les connexions violentes.

Limiter() dans la figure ci-dessus renvoie un objet RateLimiter (comme son nom l'indique : limiteur de fréquence), qui est créé par le conteneur de service d'application. Cet objet provient de : fichier IlluminateCacheRateLimiter.

Comme vous pouvez le voir depuis l'emplacement de cet objet, il utilise le mécanisme de mise en cache Laravel pour gérer le nombre de connexions.

Ainsi, la méthode hasTooManyLoginAttempts dans l'image ci-dessus appelle la méthode tropManyAttempts de l'objet RateLimiter pour vérifier le nombre de connexions :

la méthode tropManyAttempt a trois paramètres :

$key : La clé correspondante utilisée par cache pour enregistrer le numéro de connexion du compte actuel. La composition clé est la suivante :

La valeur clé ressemble donc à peu près à ceci : "email|101:10:45:12". On peut voir ici que la prévention du craquage par force brute utilise IP. Bien sûr, si je change d’adresse IP, je peux toujours essayer de me reconnecter. Même s’il y a toujours des limites, c’est quand même bien mieux que d’être nu.

$maxAttempts : La valeur de réglage du nombre maximum de tentatives de connexion.

Cette valeur peut être personnalisée. Vous pouvez écrire l'attribut maxAttempts personnalisé dans LoginController. La valeur par défaut est 5 fois :

$decayMinutes : Le temps d'attente en minutes pour reprendre la connexion après avoir atteint le nombre maximum de tentatives.

Cette valeur est également personnalisable. Personnalisez cet attribut dans LoginController. La valeur par défaut est 1 minute :

Retournez à la méthode RateLimiter::tooManyAttempts. Il déterminera si le nombre actuel de connexions a atteint la valeur définie et s'il se situe toujours dans la dernière plage de temps de connexion interdite, il retournera vrai, indiquant que l'utilisateur actuel (IP) n'a toujours pas le droit de se connecter. dans.

La case rouge dans l'image ci-dessous est utilisée pour déterminer si la valeur $key.':timer' existe dans le cache. Cette valeur utilise le temps $decayMinutes ci-dessus comme délai d'expiration, donc l'existence de celui-ci. la valeur est la clé pour restaurer l'état de connexion.

Si la valeur mise en cache n'est pas présente, l'utilisateur actuel peut se connecter. À ce stade, la méthode resetAttempts efface la valeur des heures de connexion mises en cache par $key et commence l'enregistrement à partir de zéro.

Le droit d'exécution de code revient à nouveau à la ligne 36 de IlluminateFoundationAuthAuthenticatesUsers :

Lorsque hasTooManyLoginAttempts renvoie true, l'événement Lockout est initié et la réponse LockoutResponse est renvoyée. Les utilisateurs peuvent générer un moniteur d'événements de verrouillage pour traiter la logique liée à l'événement, comme l'enregistrement des journaux de connexion, etc.

La réponse LockoutResponse lève essentiellement une exception de vérification, qui est automatiquement interprétée par Laravel comme une réponse avec un code d'état 423 et est accompagnée d'informations de configuration auth.throttle. La langue originale de cette configuration se trouve à l'adresse : /resources/lang/en/auth.php. Les utilisateurs peuvent personnaliser leurs propres informations linguistiques.

Ensuite, revenez à la ligne 42 de IlluminateFoundationAuthAuthenticatesUsers et commencez à effectuer la vérification de connexion :

Le nom du portier configuré par la méthode tentativeLogin via config/auth.php , Générez l'objet de garde correspondant, puis appelez la tentative de vérification de connexion de l'objet.

Laravel5 guard prend actuellement en charge deux types : SessionGuard et tokenGuard, tous deux sont enregistrés dans le dossier IlluminateAuth. Ils sont tous implémentés dans l'interface IlluminateContractsAuthGuard, donc si vous avez besoin de personnaliser le. garde, veuillez implémenter cette interface.
Si vous souhaitez implémenter un web guard, vous pouvez implémenter davantage l'interface IlluminateContractsAuthStatefulGuard.

Quant à quelle garde utiliser dans quelles circonstances, elles sont toutes configurées dans config/auth.php :

Puisque ce que j'analyse cette fois est Processus de connexion Web, vérifiez donc la méthode de tentative d'IlluminateAuthsessionGuard :

ligne 351 : La fonction de cette ligne est de récupérer les informations du compte via le fournisseur configuré. Il existe également deux types de fournisseurs : DatabaseUserProvider et EloquentUserProvider. Le fichier se trouve à l'emplacement : /Illuminate/Auth.

Le fournisseur spécifique à utiliser est configuré via le paramètre fournisseurs de config/auth.php Après la configuration, vous devez également spécifier quel fournisseur utiliser dans le paramètre 'guards'. Le fournisseur fournit essentiellement un moyen d'interroger la table des comptes de la base de données. La base de données utilise directement la façade de la base de données pour interroger, tandis qu'eloquent utilise un modèle pour interroger.

Laravel utilise EloquentUserProvider par défaut. En regardant la méthode retrieveByCredentials, il est évident que les informations utilisateur sont récupérées directement par le nom du compte :

Retour Le La méthode de tentative d'IlluminateAuthsessionGuard et la méthode hasValidCredentials de la ligne 356 vérifient le mot de passe, si les informations utilisateur de l'étape précédente peuvent être récupérées normalement.

Comme le montre le corps de la méthode hasValidCredentials, il appelle la méthode validateCredentials du fournisseur pour la vérification du mot de passe. Découvrez la méthode EloquentUserProvider::validateCredentials :

Cette méthode de vérification utilise la méthode de vérification de la classe de hachage implémentée par le contrat HasherContract. Les classes d'implémentation spécifiques sont : IlluminateHashingBcryptHasher. Regardons la méthode de vérification de cette classe :

Évidemment, elle utilise la fonction password_verify pour comparer le mot de passe en texte brut saisi avec la valeur du mot de passe haché. Cela nécessite que les mots de passe de la base de données aient été hachés à l'aide de password_hash.

Renvoie vrai si la vérification du mot de passe réussit. Revenez à sessionGuard et exécutez la méthode de connexion de line357 pour enregistrer l'état de connexion de la session et du cookie.

La clé et la valeur de la session enregistrée sont :

'key'=>'login_session_'.sha1(static::class) // static::class fait référence à la classe sessionGuard elle-même

'value'=>La valeur de la clé primaire de l'utilisateur actuel

Si l'option Remember_me est utilisée, le cookie suivant est enregistré, avec la clé et la valeur comme suit :

'key'=>''remember_session_'.sha1(static::class) //static::class fait référence à la classe sessionGuard elle-même

' value'=>Valeur de la clé primaire de l'utilisateur .'|'.La dernière valeur de Remember_token enregistrée.'|'.Valeur de hachage du mot de passe de l'utilisateur

À ce stade, l'utilisateur s'est connecté avec succès et le point d'exécution est enfin retourne à la ligne 42 de IlluminateFoundationAuthAuthenticatesUsers. tentativeLogin a été exécuté et renvoie true, puis appelle la méthode sendLoginResponse pour accéder à la page principale après la connexion ou à la dernière page de connexion.

Notez que la méthode authentifiée est une méthode vide. Vous pouvez redéfinir cette méthode dans LoginController pour personnaliser la façon de sauter et de gérer d'autres logiques après la connexion.

Si la connexion échoue, exécutez la méthode IncreaseLoginAttempts($request) de IlluminateFoundationAuthAuthenticatesUsers pour augmenter le nombre de connexions échouées. La méthode pour augmenter le nombre de fois consiste également à appeler indirectement la méthode hit() de la classe RateLimiter.
Enfin, appelez sendFailedLoginResponse pour renvoyer une exception de connexion.

Enfin, le chronogramme est joint. Le dessin est moyen. Certains concepts UML ne sont pas bien maîtrisés :

C'est tout. Nous espérons que l'ensemble du contenu de cet article sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Introduction au modèle Eloquent de Laravel

Comment utiliser Wamp pour créer un environnement de développement local Php et la méthode de débogage HBuilder

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn