Как изменить / Имя поля настраиваемого пароля для аутентификации пользователя Laravel 4 и Laravel 5

Я хотел бы изменить поле пароля в базе данных при использовании аутентификации Laravel. Я хочу, чтобы в моей таблице в таблице users было имя passwd а не password . Я попытался запустить что-то вроде этого:

 Auth::attempt(array( 'user_name' => 'admin', 'passwd' => 'hardpass', )); 

но это не сработает.

Я также попытался добавить в User модель следующую функцию:

 public function getAuthPassword() { return $this->passwd; } 

но он ничего не меняет. Пользователь по-прежнему не аутентифицирован. Возможно ли в Laravel изменить имя поля пароля в базе данных?

Информация

Вы можете легко изменить все остальные поля в базе данных и использовать их для аутентификации. Единственная проблема заключается в поле password .

На самом деле поле password каким-то образом жестко закодировано в Laravel (но не так, как многие думают), поэтому вы не можете просто передать массив, когда вы передали свой вопрос.

По умолчанию, если вы передаете массив для attempt (и, возможно, других функций Auth, таких как validate или once ), если вы это сделаете так:

 Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); 

по умолчанию драйвер Eloquent выполнит следующий запрос:

 select * from `users` where `user_name` = 'admin' limit 1; 

Получив эти данные из базы данных, вы сравните пароль, который вы указали с помощью свойства пароля для объекта User, который был создан.

Но если вы просто используете:

 Auth::attempt(array( 'user_name' => 'admin', 'passwd' => 'hardpass', )); 

следующий запрос будет запущен:

 select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1; 

и ни один пользователь не будет найден в базе данных (в passwd вы храните хешированный пароль). Это объясняется тем, что Eloquent удаляет password запроса, но использует любые другие данные для запуска запроса. Также, если вы попробуете здесь использовать 'passwd' => Hash:make($data['password']) хотя пользователь будет найден, сравнение пароля не будет работать.

Решение

Решение довольно просто. Вам нужно запустить Auth::attempt следующим образом:

 Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); 

Как вы видите, вы все еще передаете password как ключ (хотя этот столбец не выходит в таблицу users ), потому что только так, драйвер Eloquent не будет использовать его для построения запроса.

Теперь в файле User model ( app/models/User.php ) вам нужно добавить следующую функцию:

 public function getAuthPassword() { return $this->passwd; } 

Как вы видите, вы используете здесь столбец, который действительно существует в базе данных: passwd .

Используя его таким образом, вы можете иметь столбец с паролем с именем что угодно, и вы все равно можете использовать драйвер Eloquent по умолчанию для него.

Примеры данных для тестирования

Я создал для него очень простой тест.

Вам просто нужно заменить файл app/routes.php следующим образом:

 Route::get('/', function () { if (Auth::check()) { echo "I'm logged in as " . Auth::user()->user_name . "<br />"; echo "<a href='/logout'>Log out</a>"; } else { echo "I'm NOT logged in<br />"; Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); if (Auth::check()) { echo "Now I'm logged in as " . Auth::user()->user_name . "<br />"; echo "<a href='/logout'>Log out</a>"; } else { echo "I'm still NOT logged in<br />"; } } }); Route::get('/logout', function () { Auth::logout(); return "You have been logged out"; }); Route::get('/db', function () { if (!Schema::hasTable('users')) { Schema::create('users', function ($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->string('user_name', 60)->unique(); $table->string('passwd', 256); $table->rememberToken(); $table->timestamps(); }); DB::table('users')->insert( [ [ 'user_name' => 'admin', 'passwd' => Hash::make('hardpass'), ] ] ); } echo "Table users has been created"; }); из Route::get('/', function () { if (Auth::check()) { echo "I'm logged in as " . Auth::user()->user_name . "<br />"; echo "<a href='/logout'>Log out</a>"; } else { echo "I'm NOT logged in<br />"; Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); if (Auth::check()) { echo "Now I'm logged in as " . Auth::user()->user_name . "<br />"; echo "<a href='/logout'>Log out</a>"; } else { echo "I'm still NOT logged in<br />"; } } }); Route::get('/logout', function () { Auth::logout(); return "You have been logged out"; }); Route::get('/db', function () { if (!Schema::hasTable('users')) { Schema::create('users', function ($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->string('user_name', 60)->unique(); $table->string('passwd', 256); $table->rememberToken(); $table->timestamps(); }); DB::table('users')->insert( [ [ 'user_name' => 'admin', 'passwd' => Hash::make('hardpass'), ] ] ); } echo "Table users has been created"; }); 
  1. Создайте пустую базу данных и установите данные соединения в app/config/database.php
  2. Теперь вы можете запустить /db url, например http://localhost/yourprojectname/db только для создания таблицы пользователей.
  3. Теперь вы можете запустить / url, например, http://localhost/yourprojectname/ – как вы видите, пользователь зарегистрирован, даже если в таблице users в базе данных у вас нет столбца password (данные для аутентификации переданы как строки без каких-либо формы, но, конечно, в реальном приложении вы их добавите). Вы можете запустить этот URL еще раз – поскольку вы видите, что пользователь все еще зарегистрирован, поэтому он работает должным образом.
  4. Если вы нажмете ссылку « Log out , вы выйдете из системы

Изменения в Laravel 5 выше

Это решение было протестировано в Larave 4.2.9 (все как указано выше), а также в Laravel 5. В Laravel5 все работает одинаково, но вам нужно, конечно, редактировать файлы по разным путям:

  1. Модель User находится в файле app/User.php
  2. маршруты находятся в файле app/Http/routes.php
  3. Файл config/database.php находится в файле config/database.php