在登录尝试的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
答案 0 :(得分:30)
好吧,您只需检查$usernameinput
是否与电子邮件模式匹配,如果匹配,请使用email
字段,否则请使用username
字段。这听起来很合理,因为,你真的不应该在你的数据库中有任何与模式不匹配的电子邮件。像这样:
$field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
if (Auth::attempt([$field => $usernameinput, 'password' => $password], true)) {
// ...
}
另一个选项是在新服务提供商中扩展Illuminate\Auth\Guard
添加所需功能并将其设置为auth
组件。
答案 1 :(得分:2)
可以这样做
$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'); }
答案 2 :(得分:1)
用户可以使用电子邮件字段作为其用户名,并且可能与他们用于电子邮件字段的电子邮件不匹配。更安全地尝试两次身份验证:
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
}
答案 3 :(得分:0)
这是完整的工作解决方案:(使用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);
}
}