Laravel предоставляет способ изменить столбцы по умолчанию для аутентификации (адрес электронной почты, пароль) путем переопределения некоторых функций.
В вашей модели пользователя добавьте эту функцию, которая переопределяет столбец по умолчанию для пароля:
App/User.php
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->user_pass;
}
И в вашем LoginController измените с электронной почты на user_email
App/Http/Controllers/Auth/LoginController.php
/**
* Get the login username to be used by the controller.
*
* @return string
*/
public function username()
{
return 'user_email';
}
Теперь вы переопределили столбцы по умолчанию, используемые логикой аутентификации Laravel.Но вы еще не закончили.
В LoginController есть функция, которая проверяет ввод пользователя, а столбец пароля жестко задан в password
, поэтому, чтобы изменить это, вам также необходимо добавить эти функции в LoginController:
App/Http/Controllers/Auth/LoginController.php
/**
* Validate the user login request.
*
* @param \Illuminate\Http\Request $request
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
protected function validateLogin(Request $request)
{
$request->validate([
$this->username() => 'required|string',
'user_pass' => 'required|string',
]);
}
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
return $request->only($this->username(), 'user_pass');
}
Следующим шагом является создание собственного провайдера, назовем его CustomUserProvider
, который будет использоваться вместо стандартного EloquentUserProvider
и где вы переопределите поле пароля.
App/Providers/CustomUserProvider.php
<?php
namespace App\Providers;
class CustomUserProvider extends EloquentUserProvider
{
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
if (empty($credentials) ||
(count($credentials) === 1 &&
array_key_exists('user_pass', $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, 'user_pass')) {
continue;
}
if (is_array($value) || $value instanceof Arrayable) {
$query->whereIn($key, $value);
} else {
$query->where($key, $value);
}
}
return $query->first();
}
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['user_pass'];
return $this->hasher->check($plain, $user->getAuthPassword());
}
}
Теперь, когда вы расширили поставщика по умолчанию, вам нужно сказать Laravel использовать его вместо EloquentUserProvider
.Вот как вы можете это сделать.
App/Providers/AuthServiceProvider.php
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
$this->app->auth->provider('custom', function ($app, $config) {
return new CustomUserProvider($app['hash'], $config['model']);
});
}
Наконец, обновите информацию конфигурации config/auth.php
и измените драйвер с eloquent
на custom
(так я назвал его выше; вы можете изменить его начто вы хотите).Таким образом, файл config/auth.php
должен иметь этот бит:
'providers' => [
'users' => [
'driver' => 'custom',
'model' => App\User::class,
],
],
Надеюсь, это поможет!
С уважением