Laravel 4 Auth ::尝试使用电子邮件或用户名和密码

时间:2014-02-11 06:46:18

标签: php laravel laravel-4

在登录尝试的laravel中,我通常使用这样的东西:

if (Auth::attempt(array('email' => $usernameinput, 'password' => $password), true))
{
    // The user is being remembered...
}

基本上$usernameinput会检查我的表格中的email

我正在考虑以不同的方式执行此操作,例如我的表格中有emailusernamepassword$usernameinput可以是我的表格中的emailusername字段。

我如何Auth::attempt的条件如下:

(email==$usernameinput OR username==$usernameinput) AND password == $password

4 个答案:

答案 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);
        }
    }