Laravel 4 Auth::attempt 使用电子邮件或用户名和密码

2022-01-08 00:00:00 php laravel laravel-4

在 laravel 中进行登录尝试我通常使用这样的东西:

In laravel for login attempt I generally use something like this:

if (Auth::attempt(array('email' => $usernameinput, 'password' => $password), true))
{
    // The user is being remembered...
}

基本上 $usernameinput 将使用我表中的 email 进行检查.

Basically $usernameinput will check with email from my table.

我想用不同的方式来做,比如我的表中有 emailusernamepassword.$usernameinput 可以是我表中的 emailusername 字段.

I was thinking to do it in a different way, like there is email, username and password in my table. $usernameinput can be either email or username field in my table.

我怎样才能 Auth::attempt 条件如下:

How can I Auth::attempt with a condition like:

(email==$usernameinput OR username==$usernameinput) AND password == $password

推荐答案

好吧,您可以简单地检查 $usernameinput 是否与电子邮件模式匹配,如果匹配,则使用 email 字段,否则使用 username 字段.这听起来很合理,因为,您的数据库中确实不应该有任何与该模式不匹配的电子邮件.像这样的:

Well, you could simply check if $usernameinput matches an email pattern and if it does, use the email field, else use the username field. This sounds reasonable because, well, you really shouldn't have any e-mail in your database that doesn't match the pattern. Something like this:

$field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

if (Auth::attempt([$field => $usernameinput, 'password' => $password], true)) {
    // ...
}

另一种选择是扩展 IlluminateAuthGuard 添加所需的功能并将其设置为 auth 组件,在一个新的服务提供者中.

The other option is to extend IlluminateAuthGuard adding the wanted functionality and setting it as the auth component, in a new service provider.

相关文章