laraevl 5.4使用用户名或密码登录(均为)

时间:2017-07-21 07:07:59

标签: php laravel-5.4

我想在laravel 5.4中使用用户名或密码登录,我尝试了一些东西,但没有任何对我有用。

public function login(Request $request) {
    $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
    $request->merge([$field => $request->input('login')]);
    if ($this->auth->attempt($request->only($field, 'password')))
    {
        return redirect('/');
    }
    return redirect('/login')->withErrors([
        'error' => 'These credentials do not match our records.sssss',
    ]);
}

我在LoginController.php文件中添加了这个功能,但我认为它没有达到这个功能,那么怎么做呢?

4 个答案:

答案 0 :(得分:2)

Laravel默认提供身份验证。事实上,Laravel已经完成了所有配置。您只需要在Laravel中正确设置身份验证:

  • php artisan make:auth (这将创建您需要进行身份验证的所有路由和视图)
  • 当用户成功通过身份验证后,他们将被重定向到/ home URI。您可以通过在LoginController,RegisterController和ResetPasswordController上定义redirectTo属性来自定义验证后重定向位置:

    protected $ redirectTo ='/';

  • 您可以通过包含以下代码

    在任何控制器中获取经过身份验证的用户

    使用Illuminate \ Support \ Facades \ Auth;

    //获取当前经过身份验证的用户... $ user = Auth :: user();

    //获取当前经过身份验证的用户ID ... $ id = Auth :: id();

  • 您可以使用以下代码

    检查用户是否经过身份验证

    使用Illuminate \ Support \ Facades \ Auth;

    if(Auth :: check()){     //用户已登录... }

  • 将以下代码添加到您的登录控制器

    public function username(){     返回'用户名';  }

    if(filter_var($ username,FILTER_VALIDATE_EMAIL)){    //用户发送了他们的邮件    Auth :: attempt(['email'=> $ username,'password'=> $ password]); } else {    //他们发送了用户名    Auth :: attempt(['username'=> $ username,'password'=> $ password]); }

您可以在https://laravel.com/docs/5.4/authentication

了解有关laravel身份验证及其自定义的更多信息

答案 1 :(得分:2)

正如@Gaurav Roy所提到的,您必须首先通过在控制台php artisan make:auth上键入来创建Laravel的身份验证路由。您会注意到Controllers目录中存在一个名为Auth的目录,其中包含一些控制器。打开LoginController并覆盖username()功能,并使用密码返回您要验证的列。在你的情况下:

private $value = 'username';

public function username()
{
   return $this->value;
}

现在覆盖attemptLogin(Request $request)功能并尝试使用用户名或电子邮件登录:

protected function attemptLogin(Request $request)
{
    // try to login with username
    $loginWithUsername = $this->guard()->attempt(
        $this->credentials($request), $request->has('remember')
    );

    // if credentials with username are not valid, try with email
    if (!$loginWithUsername) {
        // replace username with email
        $this->value = 'email';
        $this->username();

        // add input value to email
        $request['email']  = $request['username'];
        unset($request['username']);

        return $this->guard()->attempt(
            $this->credentials($request), $request->has('remember')
        );
    }
    return $loginWithUsername;
}

现在转到resources->views->auth,打开login文件并替换电子邮件的输入,以便它可以接受用户名。例如:

自:

<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus>

要:

<input id="username" type="text" class="form-control" name="username" value="{{ old('username') }}" required autofocus>

现在您可以使用用户名或电子邮件登录!

答案 2 :(得分:2)

尝试这样的事情。您应该在LoginController.php中重写此代码

public function login(Request $request){

    $this->validate($request, [
       'email' => 'required|email',
        'password' => 'required|string',
    ]);

if (Auth::guard()->attempt(['email'=>$request->email,'password'=>$request-password], $request->remember)) {
if successfull, then redirect to intended location


   return view('level1'); 

else
    return view('manager');
}



    //if successfull, then redirect back to login with the form data
    return redirect()->back()->withInput($request->only('email','remember'));  


}
 return $this->sendFailedLoginResponse($request); 
 } 

答案 3 :(得分:0)

如果您想要用户名和电子邮件,那么在LoginController中,您可以尝试以下内容:

return property_exists($this, 'username') ? $this->username : 'email';