2017-07-21 76 views
0

我想在laravel 5.4中使用用戶名或密碼登錄,我嘗試了一些東西,但沒有爲我工作。laraevl 5.4使用用戶名或密碼登錄(兩者)

public function login(Request $request) { 
    $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; 
    $request->merge([$field => $request->input('login')]); 
    if ($this->auth->attempt($request->only($field, 'password'))) 
    { 
     return redirect('/'); 
    } 
    return redirect('/login')->withErrors([ 
     'error' => 'These credentials do not match our records.sssss', 
    ]); 
} 

LoginController.php文件添加了這個功能,但我認爲這是不打這個功能,那麼該怎麼辦呢?

+1

只需刪除'exit'? –

+0

這是錯誤的留在那裏。我刪除它 – JohnB

+0

是不是laravel已經有默認的中間件來處理身份驗證? –

回答

2

Laravel默認已提供身份驗證。事實上,Laravel已經配置了一切。你只需要做到以下幾點在Laravel正確設置身份驗證:

  • PHP工匠製作:AUTH(這將創建所有的路線和查看您需要進行身份驗證)
  • 當用戶成功通過身份驗證後,它們將被重定向到/ home URI。您可以通過在LoginController,RegisterController和ResetPasswordController上定義redirectTo屬性來自定義身份驗證後重定向位置:

    protected $ redirectTo ='/';

  • 您可以通過下面的代碼

    使用照亮的\ Support \外立面\驗證得到任何控制器的身份驗證的用戶;

    //獲取當前認證的用戶... $ user = Auth :: user();

    //獲取當前認證用戶的ID ... $ id = Auth :: id();

  • 您可以檢查用戶進行身份驗證或不使用下面的代碼

    使用照亮的\ Support \外立面\驗證;

    如果(AUTH ::檢查()){// 的用戶登錄... }

  • 下面的代碼添加到您的登錄控制器

    公共職能的用戶名(){ 返回'用戶名'; }

    如果(filter_var($用戶名,FILTER_VALIDATE_EMAIL)){// 用戶發送他們的電子郵件 驗證::嘗試([ '電子郵件'=> $用戶名,口令 ''=> $密碼]); } else { //他們發送的用戶名爲 Auth :: attempt(['username'=> $ username,'password'=> $ password]); }

你可以閱讀更多關於laravel認證和其定製的在https://laravel.com/docs/5.4/authentication

+0

copypasting官方手冊在這裏有什麼意義? –

+0

是否提供用戶名和電子郵件登錄? – JohnB

+1

它提供了電子郵件身份驗證。但是,如果您想使用用戶名 –

2

由於@Gaurav羅伊提到的,你必須首先通過鍵入在控制檯上php artisan make:auth創建Laravel的認證途徑。您會注意到在Controllers目錄中存在一個名爲Auth的目錄,其中包含一些控制器。打開LoginController並覆蓋username()函數並返回希望用密碼進行身份驗證的列。你的情況:

private $value = 'username'; 

public function username() 
{ 
    return $this->value; 
} 

現在覆蓋attemptLogin(Request $request)功能,並嘗試與用戶名或郵箱登錄:

protected function attemptLogin(Request $request) 
{ 
    // try to login with username 
    $loginWithUsername = $this->guard()->attempt(
     $this->credentials($request), $request->has('remember') 
    ); 

    // if credentials with username are not valid, try with email 
    if (!$loginWithUsername) { 
     // replace username with email 
     $this->value = 'email'; 
     $this->username(); 

     // add input value to email 
     $request['email'] = $request['username']; 
     unset($request['username']); 

     return $this->guard()->attempt(
      $this->credentials($request), $request->has('remember') 
     ); 
    } 
    return $loginWithUsername; 
} 

現在去resources->views->auth,開放login文件,並取代電子郵件的輸入,所以它可以接受的用戶名。例如:

來源:

<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus> 

要:

<input id="username" type="text" class="form-control" name="username" value="{{ old('username') }}" required autofocus> 

現在你可以用用戶名或郵箱登錄!

+0

所以它會登錄使用用戶名的電子郵件? – JohnB

+0

起初,它會嘗試用戶名,如果失敗,它會嘗試電子郵件。如果兩者都失敗,結果將是錯誤的 –

+0

ohk thanks ... Upvoted – JohnB

0

如果你想同時用戶名和電子郵件,然後在你的LoginController你可以嘗試這樣的:

return property_exists($this, 'username') ? $this->username : 'email'; 
2

嘗試這樣的事情。您應該在LoginController.php中覆蓋此代碼

public function login(Request $request){ 

    $this->validate($request, [ 
     'email' => 'required|email', 
     'password' => 'required|string', 
    ]); 

if (Auth::guard()->attempt(['email'=>$request->email,'password'=>$request-password], $request->remember)) { 
if successfull, then redirect to intended location 


    return view('level1'); 

else 
    return view('manager'); 
} 



    //if successfull, then redirect back to login with the form data 
    return redirect()->back()->withInput($request->only('email','remember')); 


} 
return $this->sendFailedLoginResponse($request); 
} 
相關問題