0

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

4

1 回答 1

4

你应该有一个app/Http/Controllers/Auth名为的控制器LoginController。此控制器使用 trait AuthenticatesUsers。您要做的是调整传递给attempt正在发生的凭据。这可以通过覆盖以下credentials方法来完成LoginController

use Illuminate\Http\Request;

...

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

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

更新:

如果您想知道用户是否有错误的凭据或者他们是否被禁止,那么您不需要重写该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')
        ]
    ]);
}

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

于 2022-01-12T20:27:09.173 回答