2014-09-27 4 views
10

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

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

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

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

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

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

+0

@JarekTkaczyk Это правда, но там нет информации там для пользователей, которые хотят иметь столбец пользовательских паролей в базе данных. OP упоминается только с использованием 'getAuthPassword', но для пользователя, который ищет решение, он все равно не знает, что делать. Я думал, что этот вопрос будет полезен для других пользователей, чтобы решить эту проблему шаг за шагом. –

+1

Просто подсказка - в большинстве случаев наиболее ценными ответами являются те короткие и конфиденциальные, которые точно решают проблему. –

+0

@ MarcinNabiałek вы спасли мою жизнь, это глупое пользовательское поле в моем проекте заводило меня бананами – caro

ответ

45

Информация

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

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

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

водитель Eloquent
Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

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

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 модели (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"; 
}); 
  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
Смежные вопросы