Cet article explorera en profondeur le système d'authentification du cadre de Laravel, en se concentrant sur la façon de créer un garde d'authentification personnalisé en étendant le système d'authentification de base.
Core de Laravel fournit un puissant système d'authentification qui permet d'implémenter facilement l'authentification de base. Exécutez simplement quelques commandes artisanales pour construire l'échafaudage du système d'authentification.
De plus, le système est conçu pour permettre l'extension et l'insertion d'adaptateurs d'authentification personnalisés. Cet article en discutera en détail. Avant de plonger dans la mise en œuvre de gardes d'authentification personnalisés, nous discuterons d'abord des éléments de base du système d'authentification Laravel - des gardes et des fournisseurs.
Le noyau du système d'authentification Laravel est composé de deux éléments - la garde et le fournisseur.
Les gardes peuvent être compris comme des fournisseurs logiques utilisés pour identifier les utilisateurs authentifiés. Le noyau Laravel fournit différents gardes tels que la session et le jeton. Le garde de session maintient l'état de l'utilisateur dans chaque demande par des cookies, tandis que le garde de jeton authentifie l'utilisateur en vérifiant le jeton valide dans chaque demande.
Par conséquent, le garde définit la logique de l'authentification et n'est pas toujours implémenté en récupérant des informations d'identification valides du backend. Vous pouvez implémenter un garde qui vérifie simplement le contenu spécifique dans l'en-tête de demande et authentifie l'utilisateur en fonction de ce contenu.
Un garde sera implémenté plus loin dans cet article, qui vérifie certains paramètres JSON dans l'en-tête de demande et récupère les utilisateurs valides du backend MongoDB.
Si le garde définit la logique pour l'authentification, le fournisseur d'authentification est responsable de la récupération des utilisateurs du stockage du backend. Si le garde exige que l'utilisateur soit authentifié par rapport au stockage backend, l'implémentation de l'utilisateur de recherche est incluse dans le fournisseur d'authentification.
Laravel est livré avec deux fournisseurs d'authentification par défaut - base de données et éloquent. Les fournisseurs d'authentification de base de données récupèrent les informations d'identification des utilisateurs directement à partir du stockage backend, tandis qu'Eloquent fournit une couche d'abstraction pour ce faire.
Dans notre exemple, nous implémenterons un fournisseur d'authentification MongoDB qui récupère les informations d'identification de l'utilisateur du backend MongoDB.
Ce qui précède est une introduction de base aux gardes et aux fournisseurs du système d'authentification Laravel. À partir de la section suivante, nous nous concentrerons sur le développement de gardes et de fournisseurs d'authentification personnalisés!
Examinons rapidement la liste des fichiers à implémenter dans cet article.
Si la liste des fichiers n'est pas claire pour le moment, ne vous inquiétez pas, nous discuterons de chaque fichier en détail pendant l'explication.
Dans cette section, nous expliquerons progressivement l'implémentation des fichiers requis.
Tout d'abord, nous devons informer Laravel de nos gardes personnalisés. Veuillez ajouter les détails du garde personnalisé dans le fichier config / auth.php comme indiqué ci-dessous.
<code>...<br>...<br>'guards' => [<br> 'web' => [<br> 'driver' => 'session',<br> 'provider' => 'users',<br> ],<br><br> 'api' => [<br> 'driver' => 'token',<br> 'provider' => 'users',<br> 'hash' => false,<br> ],<br><br> 'custom' => [<br> 'driver' => 'json',<br> 'provider' => 'mongo',<br> ],<br>],<br>...<br>...<br></code>
Comme vous pouvez le voir, nous avons ajouté notre garde personnalisé dans la section des fournisseurs.
<code>...<br>...<br>'providers' => [<br> 'users' => [<br> 'driver' => 'eloquent',<br> 'model' => App\User::class,<br> ],<br> 'mongo' => [<br> 'driver' => 'mongo'<br> ],<br><br> // 'users' => [<br> // 'driver' => 'database',<br> // 'table' => 'users',<br> // ],<br>],<br>...<br>...<br></code>
Nous avons ajouté notre entrée de fournisseur au modèle utilisateur du Web.
Selon les normes du système d'authentification, nous devons implémenter le modèle d'utilisateur.
Comme mentionné précédemment, le système d'authentification Laravel se compose de deux éléments - la garde et le fournisseur.
Dans cette section, nous créerons un fournisseur d'authentification responsable de la récupération des utilisateurs du backend.
Veuillez créer le fichier app / extensions / mongouserprovider.php , le contenu est le suivant.
<?php <br?>// app/Extensions/MongoUserProvider.php<br></br>namespace App\Extensions;<br></br><br></br>use Illuminate\Support\Str;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class MongoUserProvider implements UserProvider<br></br>{<br></br> /**<br></br> * The Mongo User Model<br></br> */<br></br> private $model;<br></br><br></br> /**<br></br> * Create a new mongo user provider.<br></br> *<br></br> * @return \Illuminate\Contracts\Auth\Authenticatable|null<br></br> * @return void<br></br> */<br></br> public function __construct(\App\Models\Auth\User $userModel)<br></br> {<br></br> $this->model = $userModel;<br> }<br><br> /**<br> * Retrieve a user by the given credentials.<br> *<br> * @param array $credentials<br> * @return \Illuminate\Contracts\Auth\Authenticatable|null<br> */<br> public function retrieveByCredentials(array $credentials)<br> {<br> if (empty($credentials)) {<br> return;<br> }<br><br> $user = $this->model->fetchUserByCredentials(['username' => $credentials['username']]);<br><br> return $user;<br> }<br><br> /**<br> * Validate a user against the given credentials.<br> *<br> * @param \Illuminate\Contracts\Auth\Authenticatable $user<br> * @param array $credentials Request credentials<br> * @return bool<br> */<br> public function validateCredentials(Authenticatable $user, Array $credentials)<br> {<br> return ($credentials['username'] == $user->getAuthIdentifier() &&<br> md5($credentials['password']) == $user->getAuthPassword());<br> }<br><br> public function retrieveById($identifier) {}<br><br> public function retrieveByToken($identifier, $token) {}<br><br> public function updateRememberToken(Authenticatable $user, $token) {}<br>}<br>
De même, vous devez vous assurer que le fournisseur personnalisé doit implémenter retrieveByCredentials
et la classe de modèle utilisateur discuté précédemment. D'un autre côté, le paramètre jsondata
Demande doit contenir la chaîne codée par JSON des informations d'identification.
Dans cette section, nous créerons un garde qui interagit avec le fournisseur d'authentification créé dans la section précédente.
Veuillez créer le fichier app / services / auth / jsonguard.php , le contenu est le suivant.
<?php <br?>// app/Services/Auth/JsonGuard.php<br></br>namespace App\Services\Auth;<br></br><br></br>use Illuminate\Http\Request;<br></br>use Illuminate\Contracts\Auth\Guard;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use GuzzleHttp\json_decode;<br></br>use phpDocumentor\Reflection\Types\Array_;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class JsonGuard implements Guard<br></br>{<br></br> protected $request;<br></br> protected $provider;<br></br> protected $user;<br></br><br></br> /**<br></br> * Create a new authentication guard.<br></br> *<br></br> * @param \Illuminate\Contracts\Auth\UserProvider $provider<br></br> * @param \Illuminate\Http\Request $request<br></br> * @return void<br></br> */<br></br> public function __construct(UserProvider $provider, Request $request)<br></br> {<br></br> $this->request = $request;<br> $this->provider = $provider;<br> $this->user = NULL;<br> }<br><br> /**<br> * Determine if the current user is authenticated.<br> *<br> * @return bool<br> */<br> public function check()<br> {<br> return ! is_null($this->user());<br> }<br><br> /**<br> * Determine if the current user is a guest.<br> *<br> * @return bool<br> */<br> public function guest()<br> {<br> return ! $this->check();<br> }<br><br> /**<br> * Get the currently authenticated user.<br> *<br> * @return \Illuminate\Contracts\Auth\Authenticatable|null<br> */<br> public function user()<br> {<br> if (! is_null($this->user)) {<br> return $this->user;<br> }<br> }<br><br> /**<br> * Get the JSON params from the current request<br> *<br> * @return string<br> */<br> public function getJsonParams()<br> {<br> $jsondata = $this->request->query('jsondata');<br><br> return (!empty($jsondata) ? json_decode($jsondata, TRUE) : NULL);<br> }<br><br> /**<br> * Get the ID for the currently authenticated user.<br> *<br> * @return string|null<br> */<br> public function id()<br> {<br> if ($user = $this->user()) {<br> return $this->user()->getAuthIdentifier();<br> }<br> }<br><br> /**<br> * Validate a user's credentials.<br> *<br> * @return bool<br> */<br> public function validate(Array $credentials=[])<br> {<br> if (empty($credentials['username']) || empty($credentials['password'])) {<br> if (!$credentials=$this->getJsonParams()) {<br> return false;<br> }<br> }<br><br> $user = $this->provider->retrieveByCredentials($credentials);<br><br> if (! is_null($user) && $this->provider->validateCredentials($user, $credentials)) {<br> $this->setUser($user);<br><br> return true;<br> } else {<br> return false;<br> }<br> }<br><br> /**<br> * Set the current user.<br> *<br> * @param Array $user User info<br> * @return void<br> */<br> public function setUser(Authenticatable $user)<br> {<br> $this->user = $user;<br> return $this;<br> }<br>}<br>
Tout d'abord, notre classe doit implémenter mongo
. Rappelons que la clé reflète les paramètres qui ont été précédemment ajoutés dans l'adaptateur d'implémentation CouchDB. Dans ce cas, ils ont juste besoin d'ajouter la liaison correspondante dans la méthode de connexion, qui nécessite l'implémentation de messages non autorisés.
D'un autre côté, essayez quelque chose de similaire à http://your-laravel-site/custom/mongo/login?jsondata={"username":"admin","password":"admin"}
, si l'utilisateur existe dans votre base de données, vous devez renvoyer un message success
.
Notez que ce n'est qu'un exemple pour démontrer le fonctionnement des gardes personnalisés. Pour des fonctionnalités telles que la connexion, vous devez implémenter une solution infaillible. En fait, je donne simplement un aperçu du processus d'authentification; vous êtes responsable de la construction d'une solution puissante et sécurisée pour votre application.
Le voyage d'aujourd'hui se termine ici, et j'espère que j'apporterai bientôt un contenu plus utile.
Laravel Framework fournit un puissant système d'authentification dans le noyau et peut être étendu si vous souhaitez implémenter un système d'authentification personnalisé. C'est le sujet de cet article: la mise en œuvre de gardes personnalisés et les insérer dans le flux de travail de l'authentification Laravel.
Dans ce processus, nous avons développé un système qui authentifie les utilisateurs en fonction de la charge utile JSON demandée et les correspond à la base de données MongoDB. Pour y parvenir, nous avons fini par créer un garde personnalisé et une implémentation de fournisseur personnalisé.
J'espère que cet exercice vous donnera une compréhension approfondie du processus d'authentification Laravel, et maintenant vous devriez être plus confiant dans la façon dont il fonctionne en interne.
Pour ceux qui commencent avec Laravel ou qui souhaitent étendre leurs connaissances, leurs sites Web ou leurs applications à travers des extensions, il existe de nombreuses ressources disponibles sur le marché Envato pour apprendre.
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!