2017-05-03 60 views
0

我們希望添加一項功能,用戶可以使用他們的email addressmobile登錄我們的laravel應用程序。 我們無法做到這一點,有一種方法,我們發現,但我們不高興,因爲它是在供應商文件夾,它可以很容易地刪除!用手機或在拉拉維爾電子郵箱登錄5.3

供應商的文件夾路徑vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

<?php 

namespace Illuminate\Foundation\Auth; 

use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Support\Facades\Lang; 

trait AuthenticatesUsers 
{ 
    use RedirectsUsers, ThrottlesLogins; 


    /** 
    * Show the application's login form. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function showLoginForm() 
    { 
     return view('auth.login'); 
    } 

    /** 
    * Handle a login request to the application. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \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. 
     if ($this->hasTooManyLoginAttempts($request)) { 
      $this->fireLockoutEvent($request); 
      return $this->sendLockoutResponse($request); 
     } 

     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); 
    } 

    /** 
    * Validate the user login request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return void 
    */ 
    protected function validateLogin(Request $request) 
    { 
     $this->validate($request, [ 
      $this->username() => 'required', 'password' => 'required', 
     ]); 
    } 

    /** 
    * 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') 
     //); 
     if (Auth::attempt([ 
      'mobile' => $request['username'], 
      'password' => $request['password'] 
      ],$request->has('remember')) 
      || Auth::attempt([ 
      'email' => $request['username'], 
      'password' => $request['password'] 
      ],$request->has('remember'))){ 
       return true; 
     } 
     return false; 
    } 

    /** 
    * Get the needed authorization credentials from the request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return array 
    */ 
    protected function credentials(Request $request) 
    {  
     return $request->only($this->username(), 'password'); 
    } 

    /** 
    * Send the response after the user was authenticated. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    protected function sendLoginResponse(Request $request) 
    { 
     $request->session()->regenerate(); 

     $this->clearLoginAttempts($request); 

     return $this->authenticated($request, $this->guard()->user()) 
       ?: redirect()->intended($this->redirectPath()); 
    } 

    /** 
    * The user has been authenticated. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param mixed $user 
    * @return mixed 
    */ 
    protected function authenticated(Request $request, $user) 
    { 
     // 
    } 

    /** 
    * Get the failed login response instance. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\RedirectResponse 
    */ 
    protected function sendFailedLoginResponse(Request $request) 
    { 
     return redirect()->back() 
      ->withInput($request->only($this->username(), 'remember')) 
      ->withErrors([ 
       $this->username() => Lang::get('auth.failed'), 
      ]); 
    } 

    /** 
    * Get the login username to be used by the controller. 
    * 
    * @return string 
    */ 
    public function username() 
    { 
     return 'username'; 
    } 

    /** 
    * Log the user out of the application. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function logout(Request $request) 
    { 
     $this->guard()->logout(); 

     $request->session()->flush(); 

     $request->session()->regenerate(); 

     return redirect('/'); 
    } 

    /** 
    * Get the guard to be used during authentication. 
    * 
    * @return \Illuminate\Contracts\Auth\StatefulGuard 
    */ 
    protected function guard() 
    { 
     return Auth::guard(); 
    } 
} 

回答

0

這是一個特點,你的身份驗證控制器使用這一特質。所以,你可以重寫attemptLogin方法來實現你想要的。

在這種情況下,確定是否使用手機號碼或電子郵件的邏輯將屬於該方法。

編輯

基於您的評論,你需要,實際上,attemptLogin方法複製而不是修改廠商文件app/Http/Controllers/Auth/LoginController.php

看來你已經有了某種邏輯。這應該處理它。

+0

你能告訴我,簡單的例子:) – fewBugs

+0

如何編輯我的答案 – Mozammil

0

您可以爲AuthenticatesUers.php添加自定義特徵。

步驟1)在app/traits文件夾中創建一個Trait CustomAuthenticatesUsers.php。

<?php 

namespace App\Traits; 

use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Support\Facades\Lang; 
use Illuminate\Foundation\Auth\RedirectsUsers; 
use Illuminate\Foundation\Auth\ThrottlesLogins; 

trait CustomAuthenticatesUsers 
{ 
    use RedirectsUsers, ThrottlesLogins; 

    /** 
    * Show the application's login form. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function showLoginForm() 
    { 
     if(!session()->has('url.intended')) 
     { 
      session(['url.intended' => url()->previous()]); 
     } 

     return view('auth.login'); 
    } 

    /** 
    * Handle a login request to the application. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \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. 
     if ($this->hasTooManyLoginAttempts($request)) { 
      $this->fireLockoutEvent($request); 

      return $this->sendLockoutResponse($request); 
     } 

     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); 
    } 

    /** 
    * Validate the user login request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return void 
    */ 
    protected function validateLogin(Request $request) 
    { 
     $this->validate($request, [ 
      $this->username() => 'required', 'password' => 'required', 
     ]); 
    } 

    /** 
    * 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') 
     //); 
     if (Auth::attempt([ 
      'mobile' => $request['username'], 
      'password' => $request['password'] 
      ],$request->has('remember')) 
      || Auth::attempt([ 
      'email' => $request['username'], 
      'password' => $request['password'] 
      ],$request->has('remember'))){ 
       return true; 
     } 
     return false; 
    } 

    /** 
    * Get the needed authorization credentials from the request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return array 
    */ 
    protected function credentials(Request $request) 
    { 
     return $request->only($this->username(), 'password'); 
    } 

    /** 
    * Send the response after the user was authenticated. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    protected function sendLoginResponse(Request $request) 
    { 
     $request->session()->regenerate(); 

     $this->clearLoginAttempts($request); 

     return $this->authenticated($request, $this->guard()->user()) 
       ?: redirect()->intended($this->redirectPath()); 
    } 

    /** 
    * The user has been authenticated. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param mixed $user 
    * @return mixed 
    */ 
    protected function authenticated(Request $request, $user) 
    { 
     // 
    } 

    /** 
    * Get the failed login response instance. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\RedirectResponse 
    */ 
    protected function sendFailedLoginResponse(Request $request) 
    { 
     return redirect()->back() 
      ->withInput($request->only($this->username(), 'remember')) 
      ->withErrors([ 
       $this->username() => Lang::get('auth.failed'), 
      ]); 
    } 

    /** 
    * Get the login username to be used by the controller. 
    * 
    * @return string 
    */ 
    public function username() 
    { 
     return 'username'; 
    } 

    /** 
    * Log the user out of the application. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function logout(Request $request) 
    { 
     $this->guard()->logout(); 

     $request->session()->flush(); 

     $request->session()->regenerate(); 

     return redirect('/'); 
    } 

    /** 
    * Get the guard to be used during authentication. 
    * 
    * @return \Illuminate\Contracts\Auth\StatefulGuard 
    */ 
    protected function guard() 
    { 
     return Auth::guard(); 
    } 
} 

步驟2)添加以下代碼在LoginController.php

<?php 

namespace App\Http\Controllers\Auth; 

use App\Http\Controllers\Controller; 
use App\Traits\CustomAuthenticatesUsers; 

class LoginController extends Controller 
{ 
    /* 
    |-------------------------------------------------------------------------- 
    | Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles authenticating users for the application and 
    | redirecting them to your home screen. The controller uses a trait 
    | to conveniently provide its functionality to your applications. 
    | 
    */ 

    use CustomAuthenticatesUsers; 

    /** 
    * Where to redirect users after login. 
    * 
    * @var string 
    */ 
    protected $redirectTo = '/'; 

    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware('guest', ['except' => 'logout']); 
    } 
} 
相關問題