Exemples PHP des principes d'authentification Laravel et explication détaillée de l'authentification entièrement personnalisée

无忌哥哥
Libérer: 2023-04-03 06:50:02
original
2365 Les gens l'ont consulté

J'ai récemment appris le framework Laravel, donc l'article suivant vous présente principalement les informations pertinentes sur les principes d'authentification de Laravel et l'authentification entièrement personnalisée. L'article le présente en détail à travers un exemple de code. Les amis qui en ont besoin peuvent s'y référer. . Ce qui suit est Apprenons avec l'éditeur

Avant-propos

La fonction d'authentification par défaut de Laravel est déjà très complète, mais nous en rencontrons souvent. certaines situations qui doivent être personnalisées, telles que les champs de vérification ne correspondent pas à ceux par défaut, comme la nécessité de répondre simultanément à l'authentification du nom d'utilisateur et de l'e-mail, etc. Comment créer un certificat entièrement personnalisé ? Plutôt qu'un tutoriel, je préfère vous présenter le principe de fonctionnement, afin qu'il vous soit plus facile de le modifier ou de le personnaliser vous-même.

Interface authentifiable

IlluminateContractsAuthAuthenticatable

Authenticable définit une interface qui doit être implémentée par un modèle ou une classe qui peut être utilisé pour l'authentification , c'est-à-dire que si vous devez utiliser une classe personnalisée pour l'authentification, vous devez implémenter les méthodes définies par cette interface.

// 获取唯一标识的,可以用来认证的字段名,比如 id,uuid
public function getAuthIdentifierName();
// 获取该标示符对应的值
public function getAuthIdentifier();
// 获取认证的密码
public function getAuthPassword();
// 获取remember token
public function getRememberToken();
// 设置 remember token
public function setRememberToken($value);
// 获取 remember token 对应的字段名,比如默认的 'remember_token'
public function getRememberTokenName();
Copier après la connexion

Par exemple, votre modèle d'authentification doit utiliser « jeton » au lieu de « mot de passe » comme vérification du mot de passe. Méthode getAuthPassword() La valeur de retour est 'token';

Trait authentique

IlluminateAuthAuthenticatable

Le trait authentique défini dans Laravel est également le trait d'authentification Laravel par défaut utilisé par le modèle User. Ce trait définit l'identifiant d'authentification par défaut du modèle User comme 'id', le champ du mot de passe comme 'password', le champ correspondant au jeton de mémorisation comme Remember_token, etc.

Certains paramètres peuvent être modifiés en remplaçant ces méthodes du modèle User.

Interface Guard

IlluminateContractsAuthGuard

L'interface Guard définit un modèle ou une classe qui implémente des méthodes d'authentification authentifiables (authentifiables) et certaines interfaces couramment utilisées.

// 判断当前用户是否登录
public function check();
// 判断当前用户是否是游客(未登录)
public function guest();
// 获取当前认证的用户
public function user();
// 获取当前认证用户的 id,严格来说不一定是 id,应该是上个模型中定义的唯一的字段名
public function id();
// 根据提供的消息认证用户
public function validate(array $credentials = []);
// 设置当前用户
public function setUser(Authenticatable $user);
Copier après la connexion

Interface StatefulGuard

IlluminateContractsAuthStatefulGuard

L'interface StatefulGuard hérite de l'interface Guard, à l'exception de certains éléments de base définis dans Guard En plus de l'interface, un autre Guard avec état a également été ajouté

Les interfaces nouvellement ajoutées incluent celles-ci :

// 尝试根据提供的凭证验证用户是否合法
public function attempt(array $credentials = [], $remember = false);
// 一次性登录,不记录session or cookie
public function once(array $credentials = []);
// 登录用户,通常在验证成功后记录 session 和 cookie 
public function login(Authenticatable $user, $remember = false);
// 使用用户 id 登录
public function loginUsingId($id, $remember = false);
// 使用用户 ID 登录,但是不记录 session 和 cookie
public function onceUsingId($id);
// 通过 cookie 中的 remember token 自动登录
public function viaRemember();
// 登出
public function logout();
Copier après la connexion

<🎜. >Laravel Trois gardes sont fournis par défaut : RequestGuard, TokenGuard, SessionGuard.

RequestGuard

IlluminateAuthRequestGuard

RequestGuard est un garde très simple. passé Passer dans une fermeture pour l'authentification. Vous pouvez ajouter un RequestGuard personnalisé en appelant Auth::viaRequest.

SessionGuard

IlluminateAuthSessionGuard

SessionGuard est le garde par défaut pour l'authentification Web Laravel.

TokenGuard

IlluminateAuthTokenGuard

TokenGuard convient à l'authentification API sans état via l'authentification par jeton.

Interface UserProvider

IlluminateContractsAuthUserProvider

L'interface UserProvider définit la méthode d'obtention du modèle d'authentification, comme l'obtention du modèle basé sur l'identifiant, l'obtention du modèle basé sur l'e-mail, etc.

// 通过唯一标示符获取认证模型
public function retrieveById($identifier);
// 通过唯一标示符和 remember token 获取模型
public function retrieveByToken($identifier, $token);
// 通过给定的认证模型更新 remember token
public function updateRememberToken(Authenticatable $user, $token);
// 通过给定的凭证获取用户,比如 email 或用户名等等
public function retrieveByCredentials(array $credentials);
// 认证给定的用户和给定的凭证是否符合
public function validateCredentials(Authenticatable $user, array $credentials);
Copier après la connexion

Il existe deux fournisseurs d'utilisateurs par défaut dans Laravel : DatabaseUserProvider et EloquentUserProvider.

DatabaseUserProvider

IlluminateAuthDatabaseUserProvider

Obtenez le modèle d'authentification directement via la table de la base de données.

EloquentUserProvider

IlluminateAuthEloquentUserProvider

Obtenez le modèle d'authentification via le modèle éloquent

AuthManager

IlluminateAuthAuthManager

Guard est utilisé pour authentifier si un utilisateur est authentifié avec succès, UserProvider est utilisé pour fournir la source du modèle d'authentification, et gère la garde et la personnalisation en fonction de la configuration du projet. Guard et d'autres fonctions sont implémentées via AuthManager.

AuthManager devrait être un peu comme la classe Context dans le pattern de stratégie et la factory dans la méthode factory D'une part, elle gère la Guard, et d'autre part, elle appelle la stratégie spécifique (Guard). ) via la méthode magique __call.

La classe d'implémentation correspondante de la façade Auth est AuthManager. AuthManager est enregistré en tant que singleton dans le conteneur et est utilisé pour gérer tous les travaux de garde, de fournisseur d'utilisateurs et de proxy de garde.

Authentification personnalisée

Sur la base des connaissances ci-dessus, vous pouvez savoir qu'il est très simple de personnaliser une authentification.

  • Créer un modèle d'authentification

Créer un modèle d'authentification personnalisé et implémenter l'interface Authentifiable

  • Créez un UserProvider personnalisé

Créez un UserProvider personnalisé, implémentez l'interface UserProvider et renvoyez le modèle d'authentification personnalisé ci-dessus

  • Créez un Guard personnalisé ;

Créez un Guard personnalisé et implémentez l'interface Guard ou StatefulGuard

  • 添加 guard creator 和 user provider creator 到 AuthManager 中

在 AppServiceProvider 的 boot 方法添加如下代码:

Auth::extend(&#39;myguard&#39;, function(){
 ...
 return new MyGuard(); //返回自定义 guard 实例
 ...
});

Auth::provider(&#39;myuserprovider&#39;, function(){
 return new MyUserProvider(); // 返回自定义的 user provider
});
Copier après la connexion

在 config\auth.php的 guards 数组中添加自定义 guard,一个自定义 guard 包括两部分: driver 和 provider.

&#39;oustn&#39; => [
 &#39;driver&#39; => &#39;myguard&#39;,
 &#39;provider&#39; => &#39;myusers&#39;,
],
Copier après la connexion

在 config\auth.php的 providers 数组中添加自定义 user provider.

&#39;myusers&#39; => [
 &#39;driver&#39; => &#39;myuserprovider&#39; // 里面具体的字段可以根据你创建 user provider 需要的信息自由添加,可以通过 Auth::createUserProvider(&#39;myuserprovider&#39;) 创建
],
Copier après la connexion

设置 config\auth.php 的 defaults.guard 为 oustn.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!