web-dev-qa-db-ja.com

Laravel 5.4でユーザー名または電子メールを使用したログインを許可する

これで、認証中にユーザー名を許可する方法に関するLaravelのドキュメントに従いましたが、メールを使用する機能が失われます。ユーザーがユーザー名またはメールを使用してログインできるようにします。これについてどうすればいいですか?

Laravelのドキュメントに従ってLoginControllerにこのコードを追加しましたが、ログインにはユーザー名のみが許可されています。ログイン用のユーザー名またはメールを受け入れるようにします。

public function username () {
    return 'username';
}
19
Paul Lucero

このリンクの手順に従ってください: https://laravel.com/docs/5.4/authentication#authenticating-users

次に、このようなユーザー入力を確認できます

$username = $request->username; //the input field has name='username' in form

if(filter_var($username, FILTER_VALIDATE_EMAIL)) {
    //user sent their email 
    Auth::attempt(['email' => $username, 'password' => $password]);
} else {
    //they sent their username instead 
    Auth::attempt(['username' => $username, 'password' => $password]);
}

//was any of those correct ?
if ( Auth::check() ) {
    //send them where they are going 
    return redirect()->intended('dashboard');
}

//Nope, something wrong during authentication 
return redirect()->back()->withErrors([
    'credentials' => 'Please, check your credentials'
]);

これは単なるサンプルです。これを実現するために取ることができる無数のさまざまなアプローチがあります。

19
EddyTheDove

LoginControllerのユーザー名メソッドをオーバーライドする方が簡単だと思います。

public function username()
{
   $login = request()->input('login');
   $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
   request()->merge([$field => $login]);
   return $field;
}
50
Rabah G

LoginController.phpファイル。

  1. この参照を追加

    use Illuminate\Http\Request;
    
  2. そしてcredentials methodをオーバーライドします

    protected function credentials(Request $request)
    {
        $field = filter_var($request->get($this->username()), FILTER_VALIDATE_EMAIL)
        ? 'email'
        : 'username';
    
        return [
            $field => $request->get($this->username()),
            'password' => $request->password,
        ];
    }
    

Laravel 5.7.11で正常にテストされました

5
Rakibul Islam

LoginControllerの_\Illuminate\Foundation\Auth\AuthenticatesUsers_ Traitのprotected function attemptLogin(Request $request)メソッドをオーバーライドする必要があります。つまり、LoginControllerクラスです。

_protected function attemptLogin(Request $request) {

    $identity = $request->get("usernameOrEmail");
    $password = $request->get("password");

    return \Auth::attempt([
        filter_var($identity, FILTER_VALIDATE_EMAIL) ? 'email' : 'username' => $identity,
        'password' => $password
    ]);
}
_

LoginControllerクラスは、attemptLoginメソッドをオーバーライドするためにTrait _\Illuminate\Foundation\Auth\AuthenticatesUsers_を使用する必要があります。

_class LoginController extends Controller {

     use \Illuminate\Foundation\Auth\AuthenticatesUsers;
     .......
     .......
}
_
3

LoginControllerのAuthenticatesUsers traits、credentialsメソッドのメソッドをオーバーライドするだけで、さらにシンプルだと思います。ここでは、メールまたは電話でログインするように実装しました。ニーズに合わせて変更できます。

LoginController.php

protected function credentials(Request $request)
{
    if(is_numeric($request->get('email'))){
        return ['phone'=>$request->get('email'),'password'=>$request->get('password')];
    }
    return $request->only($this->username(), 'password');
}
2
Jagadesha NH

これは私がそれを行う方法です:

// get value of input from form (email or username in the same input)
 $email_or_username = $request->input('email_or_username');

 // check if $email_or_username is an email
 if(filter_var($email_or_username, FILTER_VALIDATE_EMAIL)) { // user sent his email 

    // check if user email exists in database
    $user_email = User::where('email', '=', $request->input('email_or_username'))->first();

    if ($user_email) { // email exists in database
       if (Auth::attempt(['email' => $email_or_username, 'password' => $request->input('password')])) {
          // success
       } else {
          // error password
       }
    } else {
       // error: user not found
    }

 } else { // user sent his username 

    // check if username exists in database
    $username = User::where('name', '=', $request->input('email_or_username'))->first();

    if ($username) { // username exists in database
       if (Auth::attempt(['name' => $email_or_username, 'password' => $request->input('password')])) {
          // success
       } else {
          // error password
       }
    } else {
       // error: user not found
    }
 }       

それを行うより短い方法があると信じていますが、私にとってこれはうまくいき、理解しやすいです。

0
Maicon Gilton