This article mainly introduces how to solve the problem of implementing multi-field user authentication in Laravel. It has certain reference value. Now I share it with you. Friends in need can refer to it.
I recently encountered a person at work. The problem required multi-field verification, which was finally solved by searching for relevant information. The following article mainly introduces the solution to how Laravel implements user multi-field authentication. The article introduces it in great detail through sample code. Friends who need it You can use it as a reference, let’s take a look below.
Preface
This article mainly introduces the relevant content about Laravel user multi-field authentication, and shares it for your reference and study. The following words Not much more to say, let’s take a look at the detailed introduction.
Solution:
No more than two login fields (simple solution)
The login fields are greater than or equal to three (relatively complicated)
The login fields do not exceed two
I saw a relatively simple solution online, but it cannot solve the validation of all two fields:
filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'
Filter the form content in the request to distinguish username. The disadvantages are obvious. If the other one is not email, you will be blinded... Here is another general solution:
Override the login method in LoginController
public function login(Requests $request) { //假设字段是 email if ($this->guard()->attempt($request->only('email', 'password'))) { return $this->sendLoginResponse($request); } //假设字段是 mobile if ($this->guard()->attempt($request->only('mobile', 'password'))) { return $this->sendLoginResponse($request); } //假设字段是 username if ($this->guard()->attempt($request->only('username', 'password'))) { return $this->sendLoginResponse($request); } return $this->sendFailedLoginResponse($request); }
It can be seen that although it can solve the problem, it is obviously contrary to the elegant style of Laravel and has sold so many hurdles. Let me share my solution with you.
Login fields greater than or equal to three (relatively complicated)
First you need to implement an implementation of Illuminate\Contracts\Auth\UserProvider. For details, please refer to Adding a Custom User Provider, but I like to be lazy, so I directly inherited EloquentUserProvider and overridden the retrieveByCredentials method:
public function retrieveByCredentials(array $credentials) { if (empty($credentials)) { return; } // First we will add each credential element to the query as a where clause. // Then we can execute the query and, if we found a user, return it in a // Eloquent User "model" that will be utilized by the Guard instances. $query = $this->createModel()->newQuery(); foreach ($credentials as $key => $value) { if (! Str::contains($key, 'password')) { $query->orWhere($key, $value); } } return $query->first(); }
##Note: Change $query->where($key, $value); to
$query->orWhere($key, $value); That’s it!
class AuthServiceProvider extends ServiceProvider { /** * 注册任何应用认证/授权服务。 * * @return void */ public function boot() { $this->registerPolicies(); Auth::provider('custom', function ($app, array $config) { // 返回 Illuminate\Contracts\Auth\UserProvider 实例... return new CustomUserProvider(new BcryptHasher(), config('auth.providers.custom.model')); }); } }
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'custom' => [ 'driver' => 'custom', 'model' => App\Models\User::class, ], ],
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'custom', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
About the method of implementing multi-field login in Laravel5.4
The above is the detailed content of How to solve Laravel to implement user multi-field authentication. For more information, please follow other related articles on the PHP Chinese website!