【问题标题】:Laravel 4 Auth::attempt using either email or username and passwordLaravel 4 Auth::attempt 使用电子邮件或用户名和密码
【发布时间】:2018-10-23 04:26:03
【问题描述】:

在 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

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    好吧,您可以简单地检查 $usernameinput 是否与电子邮件模式匹配,如果匹配,则使用 email 字段,否则使用 username 字段。这听起来很合理,因为,您的数据库中确实不应该有任何与该模式不匹配的电子邮件。像这样的:

    $field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
    
    if (Auth::attempt([$field => $usernameinput, 'password' => $password], true)) {
        // ...
    }
    

    另一种选择是扩展 Illuminate\Auth\Guard 添加所需的功能并将其设置为 auth 组件,在新的服务提供者中。

    【讨论】:

    • 太好了,这是我想要的简单解决方案 :-)
    • @CodeDemon 应该的。
    【解决方案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'); }

    【讨论】:

      【解决方案3】:

      用户可以使用电子邮件字段作为他们的用户名,它可能与他们用于电子邮件字段的电子邮件不匹配。尝试两次身份验证更安全:

      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
      }
      

      【讨论】:

        【解决方案4】:

        这是完整的工作解决方案:(使用 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);
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2014-05-24
          • 2013-04-06
          • 1970-01-01
          • 2019-10-29
          • 1970-01-01
          • 2018-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多