この記事では、Laravelのユーザー認証システムの実装内容を中心に紹介しますが、参考値があるのでシェアしますので、必要な方は参考にしてください
ユーザー認証システムの実装詳細
前のセクションでは、Laravel Auth システムの基礎知識とそのコアコンポーネントについて説明しましたが、このセクションでは ## を中心に Laravel Auth システムの実装の詳細に焦点を当てます。 #Auth つまり、
AuthManager は、認証ガード (Guard) とユーザー プロバイダー (UserProvider) を読み込む方法と、デフォルトのユーザー登録とログインの実装詳細を整理することによって、独自のプロジェクトでのユーザー認証のニーズを満たすために、Auth 認証をカスタマイズします。
namespace Illuminate\Auth; class AuthManager implements FactoryContract { /** * 尝试从$guards属性中获取指定的Guard * * @param string $name * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard */ public function guard($name = null) { $name = $name ?: $this->getDefaultDriver(); return isset($this->guards[$name]) ? $this->guards[$name] : $this->guards[$name] = $this->resolve($name); } /** * 解析出给定name的Guard * * @param string $name * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard * * @throws \InvalidArgumentException */ protected function resolve($name) { //获取Guard的配置 //$config = ['driver' => 'session', 'provider' => 'users'] $config = $this->getConfig($name); if (is_null($config)) { throw new InvalidArgumentException("Auth guard [{$name}] is not defined."); } //如果通过extend方法为guard定义了驱动器,这里去调用自定义的Guard驱动器 if (isset($this->customCreators[$config['driver']])) { return $this->callCustomCreator($name, $config); } //Laravel auth默认的配置这里是执行createSessionDriver $driverMethod = 'create'.ucfirst($config['driver']).'Driver'; if (method_exists($this, $driverMethod)) { return $this->{$driverMethod}($name, $config); } throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined."); } /** * 从config/auth.php中获取给定名称的Guard的配置 * * @param string $name * @return array */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ], protected function getConfig($name) { //'guards' => [ // 'web' => [ // 'driver' => 'session', // 'provider' => 'users', // ], // 'api' => [ // 'driver' => 'token', // 'provider' => 'users', // ], //], // 根据Laravel默认的auth配置, 这个方法会获取key "web"对应的数组 return $this->app['config']["auth.guards.{$name}"]; } /** * 调用自定义的Guard驱动器 * * @param string $name * @param array $config * @return mixed */ protected function callCustomCreator($name, array $config) { return $this->customCreators[$config['driver']]($this->app, $name, $config); } /** * 注册一个自定义的闭包Guard 驱动器 到customCreators属性中 * * @param string $driver * @param \Closure $callback * @return $this */ public function extend($driver, Closure $callback) { $this->customCreators[$driver] = $callback; return $this; } /** * 注册一个自定义的用户提供器创建器到 customProviderCreators属性中 * * @param string $name * @param \Closure $callback * @return $this */ public function provider($name, Closure $callback) { $this->customProviderCreators[$name] = $callback; return $this; } /** * 创建基于session的认证看守器 SessionGuard * * @param string $name * @param array $config * @return \Illuminate\Auth\SessionGuard */ public function createSessionDriver($name, $config) { //$config['provider'] == 'users' $provider = $this->createUserProvider($config['provider'] ?? null); $guard = new SessionGuard($name, $provider, $this->app['session.store']); if (method_exists($guard, 'setCookieJar')) { $guard->setCookieJar($this->app['cookie']); } if (method_exists($guard, 'setDispatcher')) { $guard->setDispatcher($this->app['events']); } if (method_exists($guard, 'setRequest')) { $guard->setRequest($this->app->refresh('request', $guard, 'setRequest')); } return $guard; } //创建Guard驱动依赖的用户提供器对象 public function createUserProvider($provider = null) { if (is_null($config = $this->getProviderConfiguration($provider))) { return; } //如果通过Auth::provider方法注册了自定义的用户提供器creator闭包则去调用闭包获取用户提供器对象 if (isset($this->customProviderCreators[$driver = ($config['driver'] ?? null)])) { return call_user_func( $this->customProviderCreators[$driver], $this->app, $config ); } switch ($driver) { case 'database': return $this->createDatabaseProvider($config); case 'eloquent': //通过默认的auth配置这里会返回EloquentUserProvider对象,它实现了Illuminate\Contracts\Auth 接口 return $this->createEloquentProvider($config); default: throw new InvalidArgumentException( "Authentication user provider [{$driver}] is not defined." ); } } /** * 会通过__call去动态地调用AuthManager代理的Guard的用户认证相关方法 * 根据默认配置,这里__call会去调用SessionGuard里的方法 * @param string $method * @param array $parameters * @return mixed */ public function __call($method, $parameters) { return $this->guard()->{$method}(...$parameters); } }登録ユーザーLaravel Auth システムのデフォルトの登録ルートは次のとおりです:
$this->post('register', 'Auth\RegisterController@register');したがって、ユーザー登録のロジックは RegisterController の register メソッドによって完了します
class RegisterController extends Controller { //方法定义在Illuminate\Foundation\Auth\RegisterUsers中 public function register(Request $request) { $this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all()))); $this->guard()->login($user); return $this->registered($request, $user) } protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ]); } protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } }登録プロセスは非常に簡単です。ユーザーが入力したデータが正しいことを確認し、そのデータをデータベースに書き込んでユーザーを生成します。パスワードの暗号化には bcrypt アルゴリズムが使用されます。必要な場合は、一般的に使用されるソルトに変更して、ハッシュ化のためにパスワードにプレーン テキストを追加します。パスワード暗号化メソッドは、create メソッドのロジックのこの部分を変更できます。ユーザーを登録した後、SessionGuard のログイン メソッドが呼び出されて、ユーザー データをアプリケーションに読み込みます。このログイン メソッドにはログイン認証はなく、認証されたユーザーがアプリケーションにロードされるだけであることに注意してください。アプリケーションでは、アプリケーション内の任意の場所で
Auth::user() を通じてユーザー データを取得できます。 。
$this->post('login', 'Auth\LoginController@login');LoginControllerのログインロジックを見てみましょう
class LoginController extends Controller { /** * 处理登录请求 */ public function login(Request $request) { //验证登录字段 $this->validateLogin($request); //防止恶意的多次登录尝试 if ($this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } //进行登录认证 if ($this->attemptLogin($request)) { return $this->sendLoginResponse($request); } $this->incrementLoginAttempts($request); return $this->sendFailedLoginResponse($request); } //尝试进行登录认证 protected function attemptLogin(Request $request) { return $this->guard()->attempt( $this->credentials($request), $request->filled('remember') ); } //获取登录用的字段值 protected function credentials(Request $request) { return $request->only($this->username(), 'password'); } }ご覧のとおり、ログイン認証ロジックは
SessionGuard の
attempt メソッドを通じて実装されており、実際には
Auth::attempt() です。 at
attemptメソッド内のロジック:
class SessionGuard implements StatefulGuard, SupportsBasicAuth { public function attempt(array $credentials = [], $remember = false) { $this->fireAttemptEvent($credentials, $remember); $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials); //如果登录认证通过,通过login方法将用户对象装载到应用里去 if ($this->hasValidCredentials($user, $credentials)) { $this->login($user, $remember); return true; } //登录失败的话,可以触发事件通知用户有可疑的登录尝试(需要自己定义listener来实现) $this->fireFailedEvent($user, $credentials); return false; } protected function hasValidCredentials($user, $credentials) { return ! is_null($user) && $this->provider->validateCredentials($user, $credentials); } }
SessionGuard の
attempt メソッドは、最初にユーザー プロバイダーの
retliveBycredentials を渡します。ユーザー名を介したユーザー テーブルからのメソッド ユーザー データのクエリとユーザー情報の認証は、ユーザー プロバイダーの
validateCredentials を通じて実装されます。すべてのユーザー プロバイダー実装クラスは、UserProvider コントラクト (インターフェイス) で定義されたメソッドを実装します。上記の分析により、デフォルトのユーザー プロバイダーは
EloquentUserProvider
class EloquentUserProvider implements UserProvider { 从数据库中取出用户实例 public function retrieveByCredentials(array $credentials) { if (empty($credentials) || (count($credentials) === 1 && array_key_exists('password', $credentials))) { return; } $query = $this->createModel()->newQuery(); foreach ($credentials as $key => $value) { if (! Str::contains($key, 'password')) { $query->where($key, $value); } } return $query->first(); } //通过给定用户认证数据来验证用户 public function validateCredentials(UserContract $user, array $credentials) { $plain = $credentials['password']; return $this->hasher->check($plain, $user->getAuthPassword()); } } class BcryptHasher implements HasherContract { //通过bcrypt算法计算给定value的散列值 public function make($value, array $options = []) { $hash = password_hash($value, PASSWORD_BCRYPT, [ 'cost' => $this->cost($options), ]); if ($hash === false) { throw new RuntimeException('Bcrypt hashing not supported.'); } return $hash; } //验证散列值是否给定明文值通过bcrypt算法计算得到的 public function check($value, $hashedValue, array $options = []) { if (strlen($hashedValue) === 0) { return false; } return password_verify($value, $hashedValue); } }であることがわかります。 ユーザー パスワードの検証は、
EloquentUserProvider に依存する
hasher ハッシュによって行われます。 , Laravel デフォルトでは、認証システムは bcrypt アルゴリズムを使用して、ユーザーが提供したプレーンテキストのパスワードを暗号化し、それをユーザー テーブルに保存します。検証中に、
haser hasher の
check メソッドPHP 組み込みメソッド
password_verify平文パスワードが保存されている暗号文パスワードの元の値であるかどうかを検証するメソッドを渡します。
Auth::extend、
Auth::provider メソッドを通じて独自に定義したガードまたはプロバイダーを登録して、ガードを返す必要があります。または Provider インスタンス クロージャは Laravel に組み込まれます。Guard と UserProvider のカスタマイズは完全なセットである必要はありません。Guard を個別にカスタマイズして、デフォルトの EloquentUserProvider を使用することも、デフォルトの SessionGuard にカスタマイズされた UserProvider を使用させることもできます。
Laravel WeChat アプレットは、ユーザーの詳細を取得し、パラメーターを使用してアプレット コード展開を分析します。
以上がLaravelユーザー認証システムの実装詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。
