最近、仕事でマルチフィールドログインの効果の 1 つである、携帯電話または電子メールの任意の方法を使用してログインできるようにする必要があるという問題に遭遇しました。そのため、これを解決するプロセスを共有します。この記事では、Laravel5.4 でのマルチフィールド ログイン機能の実装に関する関連情報を参照してください。
はじめに
最近、プロジェクトにマルチフィールドログイン機能を実装する必要があります。簡単に言うと、ユーザー名、メールアドレス、携帯電話番号のいずれかの方法を使用してログインできます。したがって、この記事では、Laravel5.4 マルチフィールドログインに関する関連コンテンツを紹介し、参考と学習のために共有します。早速、詳細な紹介を見てみましょう。
以下の内容はlaravel5.4をベースにしています
方法は以下の通りです
まず、artisanツールを通じてauthモジュールを生成します
php artisan make:auth
このとき、Authディレクトリが登録とログインに関連するコントローラーである AppHttpControllers ディレクトリに追加されると、登録とログインに関連する一部のビューも resourceviews ディレクトリに生成されます
Laravel の公式ドキュメントには、ユーザーの手動認証には、 IlluminateSupportFacadesAuth クラスは次のようになります。
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; class LoginController extends Controller { /** * Handle an authentication attempt. * * @return Response */ public function authenticate() { if (Auth::attempt(['email' => $email, 'password' => $password])) { // Authentication passed... return redirect()->intended('dashboard'); } } }
このメソッドは、渡した内容に基づいて行われます。入力されたパラメーターによって、データベース内に一致するユーザーが存在するかどうかが決まり、そのユーザーが存在し、パスワードが正しい場合は true を返し、それ以外の場合は false を返します。次に、このメソッドを LoginController に追加しましたが、効果がないようだったので、 LoginController の実装メカニズムを観察し始め、それが AuthenticatesUsers のトレイトを実装していることを発見し、このトレイトの定義ファイルを追跡しました。これが私たちが望むものです
その中にはログインロジックの処理を担当するログインメソッドがあります
/** * Handle a login request to the application. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response */ public function login(Request $request) { // 表单验证 $this->validateLogin($request); // If the class is using the ThrottlesLogins trait, we can automatically throttle // the login attempts for this application. We'll key this by the username and // the IP address of the client making these requests into this application. // 防止暴力破解,多次登录失败会根据IP锁定 if ($this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } // 这个就是主要的负责判断数据库中是否存在相应的账号和密码的地方,我们需要重写的就是attemptLogin方法 if ($this->attemptLogin($request)) { return $this->sendLoginResponse($request); } // If the login attempt was unsuccessful we will increment the number of attempts // to login and redirect the user back to the login form. Of course, when this // user surpasses their maximum number of attempts they will get locked out. // 登录失败,失败次数++,防止暴力破解 $this->incrementLoginAttempts($request); // 返回失败响应 return $this->sendFailedLoginResponse($request); }
このファイルのウェーブを分析したところ、ログイン判定の主なメソッドはattemptLoginメソッドであることがわかりました。このメソッドを書き換えます。まず元のメソッドがどのように記述されているかを確認してから、元のメソッドに従って書き換えます。
/** * Attempt to log the user into the application. * * @param \Illuminate\Http\Request $request * @return bool */ protected function attemptLogin(Request $request) { return $this->guard()->attempt( $this->credentials($request), $request->has('remember') ); }
LoginController を書き換えた後:
public function attemptLogin(Request $request) { $username = $request->input('username'); $password = $request->input('password'); // 验证用户名登录方式 $usernameLogin = $this->guard()->attempt( ['username' => $username, 'password' => $password], $request->has('remember') ); if ($usernameLogin) { return true; } // 验证手机号登录方式 $mobileLogin = $this->guard()->attempt( ['mobile' => $username, 'password' => $password], $request->has('remember') ); if ($mobileLogin) { return true; } // 验证邮箱登录方式 $emailLogin = $this->guard()->attempt( ['email' => $username, 'password' => $password], $request->has('remember') ); if ($emailLogin) { return true; } return false; }
複数の判定を行うには、attempt メソッドを使用する必要があります。成功した場合は true を返します。成功しなかった場合は引き続き他のフィールドを使用して判定し、複数フィールドのログイン効果を得ることができます。
以上がLaravel5.4に複数フィールドログイン機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。