Информация
Вы можете изменить легко все другие поля в базе данных и использовать их для проверки подлинности. Единственная проблема заключается в поле 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";
});
- Создание пустой базы данных и набор данных соединений в
app/config/database.php
- Теперь вы можете запустить
/db
URL, например http://localhost/yourprojectname/db
только для создания пользователей Таблица.
- Теперь вы можете запустить
/
URL, например http://localhost/yourprojectname/
- как вы видите пользователь вошел в систему, даже если в users
таблицы в базе данных, не имеют никакого password
столбца (данные для аутентификации был принят в виде строки без каких-либо форм, но, конечно в реальном приложении вы их добавите). Вы можете запустить этот URL еще раз - поскольку вы видите, что пользователь все еще зарегистрирован, поэтому он работает должным образом.
- Если нажать на
Log out
ссылку, вы логаут
Laravel 5 изменений для выше
Это решение было испытано в Larave 4.2.9 (все, как описано выше), а также в Laravel 5. в Laravel5 все работает так же, но вам нужно, конечно, редактировать файлы в различных путях:
User
модели в app/User.php
файле
- маршрутов в
app/Http/routes.php
файле
- конфигурация базы данных файл находится в файле
config/database.php
@JarekTkaczyk Это правда, но там нет информации там для пользователей, которые хотят иметь столбец пользовательских паролей в базе данных. OP упоминается только с использованием 'getAuthPassword', но для пользователя, который ищет решение, он все равно не знает, что делать. Я думал, что этот вопрос будет полезен для других пользователей, чтобы решить эту проблему шаг за шагом. –
Просто подсказка - в большинстве случаев наиболее ценными ответами являются те короткие и конфиденциальные, которые точно решают проблему. –
@ MarcinNabiałek вы спасли мою жизнь, это глупое пользовательское поле в моем проекте заводило меня бананами – caro