2017-05-03 2 views
0

Wir möchten eine Funktionalität hinzufügen, wo der Benutzer in unsere Laravel-Anwendung mit ihrem email address oder ihre mobile anmelden können. Wir sind nicht in der Lage, das gleiche zu tun, es gibt einen Weg, den wir gefunden haben, aber wir sind nicht glücklich, da es innerhalb des Lieferantenordners ist, der leicht entfernt werden kann!Login mit Handy oder E-Mail in Laravel 5.3

Anbieter Ordnerpfadvendor/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(); 
    } 
} 

Antwort

0

Dies ist ein Merkmal, und Ihre Authentifizierungs Controller verwendet diese Eigenschaft. Sie können also einfach die attemptLogin Methode überschreiben, um zu erreichen, was Sie wollen.

In diesem Fall würde die Logik zur Bestimmung, ob eine Handynummer oder E-Mail verwendet werden soll, unter diese Methode fallen.

EDIT

Basierend auf Ihren Kommentar, müssen Sie eigentlich die attemptLogin Methode app/Http/Controllers/Auth/LoginController.php kopieren, anstatt die Herstellerdateien modifizieren.

Es scheint, dass Sie bereits eine Art von Logik dort laufen haben. Das sollte damit umgehen.

+0

können Sie mir sagen, wie einfaches Beispiel :) – fewBugs

+0

meine Antwort Bearbeitet – Mozammil

0

Sie können eine benutzerdefinierte Eigenschaft für AuthenticatesUers.php hinzufügen.

Schritt 1) ​​Erstellen Sie eine Eigenschaft CustomAuthenticatesUsers.php in App/Traits-Ordner.

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

Schritt 2) Fügen Sie den folgenden Code in 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']); 
    } 
}