現在我已經按照Laravel的文檔介紹瞭如何在認證過程中允許用戶名,但是這會消除使用電子郵件的能力。我想讓用戶使用他們的用戶名或電子郵件登錄。我如何去做這件事?允許在Laravel 5.4中使用用戶名或電子郵件登錄
我已經按照Laravel的文檔將此代碼添加到LoginController,並且它只允許用戶名登錄。我希望它接受用戶名或電子郵件登錄。從這個鏈接
public function username() {
return 'username';
}
現在我已經按照Laravel的文檔介紹瞭如何在認證過程中允許用戶名,但是這會消除使用電子郵件的能力。我想讓用戶使用他們的用戶名或電子郵件登錄。我如何去做這件事?允許在Laravel 5.4中使用用戶名或電子郵件登錄
我已經按照Laravel的文檔將此代碼添加到LoginController,並且它只允許用戶名登錄。我希望它接受用戶名或電子郵件登錄。從這個鏈接
public function username() {
return 'username';
}
遵照說明: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'
]);
這僅僅是一個樣品。你可以採取無數種方法來實現同樣的目標。
我認爲一個簡單的方法是隻覆蓋的用戶名法的LoginController:
public function username()
{
$login = request()->input('login');
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$field => $login]);
return $field;
}
我認爲它更加簡單,只需編輯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';
謝謝,這是我感謝你的解決方案。
保護功能的憑據(請求$要求){
$login = request()->input('email');
// Hayamos el tipo campo del que se trata, email o username.
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'user_name';
return [
$field => $request->get('email'),
'password' => $request->password,
'verified' => 1
];
}
你需要從\Illuminate\Foundation\Auth\AuthenticatesUsers
特質覆蓋protected function attemptLogin(Request $request)
方法在你的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類應使用Trait \Illuminate\Foundation\Auth\AuthenticatesUsers
以覆蓋attemptLogin
方法即
class LoginController extends Controller {
use \Illuminate\Foundation\Auth\AuthenticatesUsers;
.......
.......
}
您是否正在使用laravel的默認身份驗證?如果是的話,你必須選擇用戶名或電子郵件。不是都。 usrname返回一個字符串,而不是一個數組。如果你想自定義登錄,你必須自己編寫邏輯。 – EddyTheDove
我該怎麼做?如果我想寫自己的邏輯,我不確定要編輯哪些文件。 –
查看下面的答案。 – EddyTheDove