2017-07-21 11 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

は、すでに、認証を処理するためのデフォルトのミドルウェアを持っていないのですか? –

答えて

2

Laravelは既定で既に認証を提供しています。実際にはすべてがLaravelによって既に設定されています。あなただけのLaravelで正しく認証を設定するために、次の操作を行う必要があります

  • PHPの職人メイクを:AUTH(これはすべてのルートを作成し、認証のために必要と表示されます)
  • ユーザーである場合には認証に成功すると、/ home URIにリダイレクトされます。 LoginController、RegisterController、およびResetPasswordControllerに対してredirectToプロパティを定義することによって、認証後のリダイレクトの場所をカスタマイズできます。

    protected $ redirectTo = '/';

  • あなたは以下のコード

    が点灯\サポート\ファサード\認証を使用して含めることにより、任意のコントローラで認証されたユーザを取得することができます。

    //現在認証されているユーザーを取得します。 $ user = Auth :: user();

    //現在認証されているユーザーのIDを取得してください。 $ id = Auth :: id();

  • ユーザーが認証されていないか、以下のコード

    使用を照らし\サポート\ファサード\認証を使用している場合は、確認することができ

    ()(認証::チェック)の場合{// ユーザーが... ログインしている}

  • ログインコントローラに

    パブリック関数のユーザー名を(){以下のコードを追加します。 'username'を返します。 }(にfilter_var($ユーザ名、FILTER_VALIDATE_EMAILは)){ //ユーザーが自分の電子メール のAuth ::試み([ 'メール' => $ユーザ名、 'パスワード' => $パスワード])を送信した場合

    。 } else { //代わりにユーザ名を送信 Auth :: attempt(['username' => $ username、 'password' => $ password]); }

あなたはlaravel認証とそのカスタマイズの@Gauravロイが述べたように、あなたが最初のコンソールphp artisan make:authに入力して、Laravelの認証ルートを作成する必要がありますhttps://laravel.com/docs/5.4/authentication

+0

ここでのコピペストの公式マニュアルは何ですか? –

+0

usernameとemailの両方でログインできますか? – JohnB

+1

電子メールによる認証を提供します。ただし、ユーザ名 –

2

で詳細を読むことができます。 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ありがとう... 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); 
} 
関連する問題