首页 > 解决方案 > laravel 在尝试登录时返回 false 以获得正确的凭据

问题描述

laravel "^7.11.0"我的自定义登录没有任何问题,当我将其更新到新版本时,此代码返回 false:

//LoginController.php
$this->attemptLogin($request)

//trait AuthenticatesUsers.php
protected function attemptLogin(Request $request)
{
    return $this->guard()->attempt(
        $this->credentials($request), $request->filled('remember')
    );
}

但作为7.11.0回报true,我不知道laravel "^7.28.3"返回 false 的新版本会发生什么,这导致我无法更新laravel

我的自定义登录:

<?php

namespace App\Http\Controllers\Auth;

use App\Events\UserAuthenticate;
use App\Http\Controllers\Controller;
use App\User;
use Carbon\Carbon;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Laravel\Socialite\Facades\Socialite;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function login(Request $request)
    {
        $this->validateLogin($request);

        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

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

        if (auth()->validate($request->only('username','password'))) {
            $user = User::whereUsername($request->username)->first();

            if ($user->lock) {
                $request->session()->flash('error',__('message.your_account_locked'));
                return view('layouts.backend.pages.auth.account.locked_account');
            }elseif (!$user->active) {
                $checkActivationCode = $user->activationCode()->where('expire', '>=', Carbon::now())->latest()->first();

                if ($checkActivationCode != null) {
                    if ($checkActivationCode->expire > Carbon::now()) {
                        $this->incrementLoginAttempts($request);

                        $request->session()->flash('error',__('message.please_active_your_account'));
                        return view('layouts.backend.pages.auth.account.active_account');
                    }
                }else{
                    return redirect()->to('/page/userAccountActivation/create');
                }
            }
        }

        if ($this->attemptLogin($request)) {
            dd('aaaaaa');
            return $this->sendLoginResponse($request);
        }

        $this->incrementLoginAttempts($request);

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

    public function redirectToProvider()
    {
        return Socialite::driver('google')->redirect();
    }

    public function show()
    {
        return view('auth.login');
    }

    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            'username' => 'required|string',
            'password' => 'required|string',
            'g-recaptcha-response', 'recaptcha'
        ]);
    }
}

标签: phplaravel

解决方案


用于凭证的默认字段是email并且password 您应该在 上定义一个username方法,LoginController以便该方法在调用它以使用与凭证中的用户名字段不同的字段credentials时提取正确的凭证:attemptLoginemail

“默认情况下,Laravel 使用该email字段进行身份验证。如果你想自定义这个,你可以username在你的 : 上定义一个方法LoginController” - Laravel 7.x Docs

public function username()
{
    return 'username';
}

附带说明一下,在auth()->validate(...)您拥有来自身份验证系统的用户之后,您可以从那里自己登录:

if ($this->guard()->validate(....)) {
    $user = $this->guard()->user();

    ...

    $this->guard()->login($user, $remember);

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

除非您正在侦听Illuminate\Auth\Events\Attempting事件或此时Illuminate\Auth\Events\Failed不需要调用的事件,否则attemptLogin您已经完成了警卫attempt方法的工作(减去这两个事件)。

Laravel 7.x 文档 - 身份验证 - 身份验证 - 用户名自定义


推荐阅读