[英]Laravel 5.7 Auth with email/username and password using tymon/jwt
[英]Laravel 4 Auth::attempt using either email or username and password
在laravel中尝试登录时,我通常使用如下所示的内容:
if (Auth::attempt(array('email' => $usernameinput, 'password' => $password), true))
{
// The user is being remembered...
}
基本上$usernameinput
将检查表中的email
。
我当时正在考虑以另一种方式来执行此操作,例如表中有email
, username
和password
。 $usernameinput
可以是我表中的email
或username
段。
如何使用以下条件进行Auth::attempt
:
(email==$usernameinput OR username==$usernameinput) AND password == $password
好吧,您可以简单地检查$usernameinput
与电子邮件模式匹配,如果匹配,则使用email
字段,否则使用username
字段。 这听起来是合理的,因为,好吧,您的数据库中实际上不应该包含任何不匹配该模式的电子邮件。 像这样:
$field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
if (Auth::attempt([$field => $usernameinput, 'password' => $password], true)) {
// ...
}
另一个选项是扩展Illuminate\\Auth\\Guard
,在新的服务提供者中添加所需的功能并将其设置为auth
组件。
可以这样做
$field = Validator::make(array('email' => $usernameinput, array('email' => 'email'))->passes() ? 'email' : 'username'; if (Auth::attempt(array($field => $usernameinput, 'password' => $password), true)) { return Redirect::intended('profile'); }
用户可以使用电子邮件字段作为其用户名,并且该名称可能与他们用于电子邮件字段的电子邮件不匹配。 更安全地尝试两次身份验证:
if (Auth::attempt(array(
'email' => Input::get('email_or_username'),
'password' => Input::get('password')
)) ||
Auth::attempt(array(
'username' => Input::get('email_or_username'),
'password' => Input::get('password')
))) {
// SUCCESS
} else {
// FAILURE
}
这是完整的工作解决方案:(使用Laravel 5.3测试)
只需将此方法(或可以说重写)添加到app \\ Http \\ Controllers \\ Auth \\ LoginController.php中
public function login(Request $request)
{
$usernameinput = $request->input('email');
$password = $request->input('password');
$field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
if (Auth::attempt([$field => $usernameinput, 'password' => $password])) {
return redirect()->intended('/');
} else {
return $this->sendFailedLoginResponse($request);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.