Разрешить вход с помощью имени пользователя или электронной почты в Laravel 5.4

теперь я следил за документацией Laravel о том, как разрешить имена пользователей во время аутентификации, но это отнимает возможность использовать электронную почту. Я хочу разрешить пользователям использовать свое имя пользователя или электронную почту для входа в систему. Как мне это сделать?

Я добавил этот код в LoginController в соответствии с документацией Laravel, и он позволяет только имя пользователя для входа. Я хочу, чтобы он принимал имя пользователя или электронную почту для входа.

public function username () {
    return 'username';
}

6 ответов


следуйте инструкциям по этой ссылке: 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'
]);

Это всего лишь пример. Существует бесчисленное множество различных подходов, которые вы можете предпринять, чтобы достичь того же.


Я думаю, что более простой способ-просто переопределить метод username В LoginController:

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

вам нужно переопределить protected function attemptLogin(Request $request) метод \Illuminate\Foundation\Auth\AuthenticatesUsers черта в вашем LoginController т. е. в моем классе 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 должен использовать признак \Illuminate\Foundation\Auth\AuthenticatesUsers для того, чтобы переопределить attemptLogin метод, т. е.

class LoginController extends Controller {

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

Я думаю, что это еще проще, просто редактировать AuthenticatesUsers черты, метод учетных данных. Здесь я реализовал для входа в систему с помощью электронной почты или телефона. Вы можете изменить его в соответствии с вашими потребностями.

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

This solution of "Rabah G" works for me in Laravel 5.2. I modified a litle but is the same

$loginType = request()->input('useroremail');
$this->username = filter_var($loginType, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$this->username => $loginType]);
return property_exists($this, 'username') ? $this->username : 'email';

Спасибо, это решение я получил благодаря тебе.

protected function credentials(Request $request) { 

$login = request()->input('email'); 

// Check whether username or email is being used
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'user_name'; 
return [ 
   $field    => $request->get('email'), 
  'password' => $request->password, 
  'verified' => 1 
]; 
}