为 laravel ui auth 添加登录条件

Tur*_*per 0 authentication laravel laravel-ui

我使用 laravel ui auth 包进行登录。但我想为用户添加新的登录条件,除了电子邮件和密码(isBanned 布尔值)。但是,我不知道在哪里和文件可供我编辑以添加新条件。

lag*_*box 7

你应该有一个app/Http/Controllers/Auth名为 name的控制器LoginController。这个控制器使用了一个特质AuthenticatesUsers。您想要做的是调整传递给attempt正在发生的事件的凭据。credentials这可以通过重写以下方法来完成LoginController

use Illuminate\Http\Request;

...

protected function credentials(Request $request)
{
    return $request->only($this->username(), 'password') + [
        'isBanned' => false
    ];
}
Run Code Online (Sandbox Code Playgroud)

这将添加isBanned到凭据中,这些凭据都是查找用户的查询中的“where”条件(“密码”字段除外)。

更新:

如果您希望能够知道用户是否有错误的凭据或者他们是否被禁止,那么您不需要重写该credentials方法,您只需重写该attemptLogin方法和sendFailedLoginResponse以下方法即可LoginController

protected function attemptLogin(Request $request)
{
    return $this->guard()->attemptWhen(
        $this->credentials($request),
        fn ($user) => ! $user->isBanned,
        $request->filled('remember')
    )
}


protected function sendFailedLoginResponse(Request $request)
{
    $user = $this->guard()->getLastAttempted();

    throw ValidationException::withMessages([
        $this->username() => [
            $user && $this->guard()->getProvider()->validateCredentials($user, $this->credentials($request))
                ? 'You are banned'
                : trans('auth.failed')
        ]
    ]);
}
Run Code Online (Sandbox Code Playgroud)

我们不会调整凭据,因此我们让用户提供商根据用户的凭据(用户名/电子邮件和密码)获取用户。通过调用,attemptWhen我们可以添加一个回调条件,以查看在通过凭据检索用户并验证用户后是否要让他们登录。我们创建一个回调来检查用户是否被禁止。在中,sendFailedLoginResponse我们正在检查警卫是否有一lastAttempted组(用户提供者是否根据凭据检索用户)。如果它确实有用户并且凭据有效,那么他们必须被禁止,否则他们将被登录。所有其他情况我们都会返回身份验证失败消息。