Поэтому я обнаружил несколько проблем, которые говорят, что вы должны переопределить getAuthPassword (), чтобы предоставить пользовательское имя столбца пароля из базы данных. Попробовал поставить этот метод с тем же именем, что и в столбце в базе данных, и не работал. Он по-прежнему снимает эту ошибку: Неопределенный индекс: пароль.
Это auth:
if (Auth::attempt(Input::only('user_displayName'), Input::get('user_password')))
Пробовал сменить user_password на пароль как в форме, так и в контроллере ничего не работает.
Итак, вопрос в том, есть ли у меня столбец в базе данных под названием «user_password», есть ли способ заставить Auth работать?
PS проверял все старые решения, которые я нашел
РЕДАКТИРОВАТЬ
Структура таблицы пользователя:
+======================+ | User | +======================+ | user_id | +----------------------+ | user_displayName | +----------------------+ | user_fname | +----------------------+ | user_lname | +----------------------+ | user_email | +----------------------+ | user_password | +----------------------+ | created_at | +----------------------+ | updated_at | +----------------------+
tldr; Вы можете называть поле своего пароля любым удобным для вас способом, если модель User правильно использует интерфейс.
Однако вы не можете передать другой ключ массива методу Auth::attempt
– может быть только индекс password
Прежде всего, вы делаете это неправильно – вам нужно передать массив учетных данных в качестве первого параметра:
if (Auth::attempt(Input::only('user_displayName', 'user_password')))
Далее, к сожалению, у провайдера Eloquent
есть жестко закодированный индекс массива password
в коде, поэтому вы не можете передать user_password
методу attempt
.
Так вот что вам нужно:
$credentials = Input::only('user_displayName'); $credentials['password'] = Input::get('user_password'); if (Auth::attempt($credentials)) // or simply rename the input in your form to password and: if (Auth::attempt(Input::only('user_displayName', 'password')))
Я не тестировал это, но считаю, что вам просто нужно переопределить функцию в UserTrait.php, хотя не взламывайте источник. В ваших файлах моделей / User.php добавьте следующую функцию.
/** * Get the password for the user. * * @return string */ public function getAuthPassword() { return $this->user_password; }
Существует статическое решение для ситуаций, когда реализация данного интерфейса недостаточна (например, у вас есть два столбца пароля, пароль пользователя и пароль поддержки).
$qry = DB::table('users') ->where('email', $email) ->whereNotNull('support_password') ->first(); if(!empty($qry)) { $check = Hash::check($password, $qry->support_password); if ($check) { Auth::loginUsingId($qry->id, true); } }
Вот мой способ изменения поля электронной почты по умолчанию для входа в Laravel в «email_address» без изменения кода поставщика.
Я создал класс признаков, который расширяет черту поставщика AuthenticatesUsers. И только расширенный метод имени пользователя.
App \ Http \ Контроллеры \ Auth \ AuthenticatesLogins.php:
namespace App\Http\Controllers\Auth; use Illuminate\Foundation\Auth\AuthenticatesUsers; trait AuthenticatesLogins { use AuthenticatesUsers { AuthenticatesUsers::username as parentUsername; } /** * Get the login username to be used by the controller. * * @return string */ public function username() { $this->parentUsername(); return 'email_address'; } }
Теперь в приложении \ Http \ Controllers \ Controller \ LoginController.php:
class LoginController extends Controller { use AuthenticatesLogins; // <-- for custom login fields // etc.
И … сделано! Надеюсь это поможет.