首页 > 解决方案 > 如何在 Laravel 登录中检查附加条件?

问题描述

我是自学 Laravel。我正在尝试使用自定义消息为 laravel 登录添加更多条件,但永远不会引发错误!。我正在尝试检查用户是否未锁定以及是否验证了电子邮件。这是我在 LoginController 中的代码:

protected function attemptLogin(Request $request)
{
    $valid = $this->guard()->attempt(
        $this->credentials($request), $request->filled('remember')
    ); // this will return true or false.
    if ($valid) { //if credentials are valid, check additional conditions.
        $user = $this->guard()->user();
        if ($user->email_verified_at == null || $user->locked == true) {
            $valid = false;
            return $valid;
        } else {
            $this->createUserFolder(); // if the login is successfull.
            $valid = true;
            return $valid;
        }
    }
    $valid = false;
    return $valid;
}

protected function sendFailedLoginResponse(Request $request)//this will get triggered if the method above (attemptLogin(Request $request))  returns false.
{
    $credentials = [
        'email' => $request['email'],
        'password' => $request['password'],
    ];
    $valid= Auth::attempt($credentials);
    if ($valid== false) { //if user credentials are incorrect
        $errors = [$this->username() => trans('auth.failed')];
        return redirect()->back()
            ->withInput($request->only($this->username(), 'remember'))
            ->withErrors($errors);
    } else { // //if user credentials are correct
        $user = User::where('email', $request->input('email'))->first();

        if ($user->locked == '1') {
            throw ValidationException::withMessages([
                $this->username() => [trans('auth.locked')],
            ])->redirectTo('login');
        } else {
            throw ValidationException::withMessages([
                $this->username() => [trans('auth.notactivated')],
            ])->redirectTo('login');
        }
    }
}

public function logout(Request $request)
{
    Auth::logout();
    \Artisan::call('cache:clear');
    $this->guard()->logout();
    \Session::flush();
    return redirect(\URL::previous());
}

是否可以将 sendFailedLoginResponse 用于上述多个条件?我的代码有什么问题?感谢帮助。

标签: laravelauthentication

解决方案


I find the answer as below:

protected function sendFailedLoginResponse(Request $request)//this will get triggered if the method above (attemptLogin(Request $request))  returns false.
{
    $credentials = [
        'email' => $request['email'],
        'password' => $request['password'],
    ];
    $valid = Auth::attempt($credentials);

    if ($valid == false) { //if user credentials are incorrect
        $errors = [$this->username() => trans('auth.failed')];
         Auth::logout();
        return redirect()->back()
            ->withInput($request->only($this->username(), 'remember'))
            ->withErrors($errors);
    } else { // //if user credentials are correct check additional conditions
        $user = User::where('email', $request->input('email'))->first();`enter code here`
        if ($user->locked == 1) {
            $errors = [$this->username() => trans('auth.locked')];
            Auth::logout();
            throw ValidationException::withMessages([
                $this->username() => [trans('auth.locked')],
            ]);
        } else {
            $errors = [$this->username() => trans('auth.notactivated')];
            Auth::logout();
            return redirect()->back()
                ->withInput($request->only($this->username(), 'remember'))
                ->withErrors($errors);
        }
    }
}

推荐阅读