2013-06-14 12 views
8

Я пытаюсь использовать класс Autara Laravel, но каждый раз, когда я пытаюсь войти в систему, метод возвращает false. Вот мой код:Laravel 4 Auth :: попытка() всегда возвращает false

routes.php

Route::get('new-user', function() { 
    return View::make('register'); 
}); 

Route::post('new-user', function() { 
    $name = Input::get('name'); 
    $email = Input::get('email'); 
    $password = Hash::make(Input::get('password')); 

    $user = new User; 
    $user->name = $name; 
    $user->email = $email; 
    $user->password = $password; 

    $user->save(); 
});  

Route::get('login', function() { 
     return View::make('login'); 
    }); 

    Route::post('login', function() { 

     $user = array(
      'email' => Input::get('email'), 
      'password' => Hash::make(Input::get('password')) 
     ); 

     if (Auth::attempt($user)) { 
      //return Redirect::intended('dashboard'); 
      return "ok."; 
     } else { 
      return "Wrong."; 
     } 

    }); 

просмотров/login.blade.php

{{ Form::open(array('url' => 'login', 'method' => 'post')) }} 

    <h1>Login:</h1> 

    <p> 
     {{ Form::label('email', 'Email: ') }} 
     {{ Form::text('email') }}<br /> 

     {{ Form::label('password', 'Password: ') }} 
     {{ Form::password('password') }}<br /> 
    </p> 

    <p> 
     {{ Form::submit('Login') }} 
    </p> 

{{ Form::close() }} 

конфигурации/auth.php

return array(

    'driver' => 'eloquent', 
    'model' => 'User', 
    'table' => 'users', 
    'reminder' => array(
     'email' => 'emails.auth.reminder', 'table' => 'password_reminders', 
    ), 

); 

база данных имеет электронную почту & поля пароля, а поле пароля - varchar (60). Всякий раз, когда я отправляю информацию для входа в/login, он возвращает меня «Неправильно». Я действительно не понимаю, что здесь не так?

ответ

3

Не хэш пароля перед попыткой:

$user = array(
     'email' => Input::get('email'), 
     'password' => Input::get('password') 
    ); 

    if (Auth::attempt($user)) { 
     //return Redirect::intended('dashboard'); 
     return "ok."; 
    } else { 
     return "Wrong."; 
    } 
+0

Он по-прежнему возвращает мне false («Неправильно»). – John

+1

В соответствии с документацией (http://four.laravel.com/docs/security#storing-passwords) пароли передаются unhashed для попытки(). Я уверен, что это была одна проблема, но у вас может быть несколько. Убедитесь, что пароль правильно сохранен в вашей таблице пользователей. –

+0

Вот как я храню пользователей в базе данных: 'Route :: post ('new-user', function() { $ name = Вход :: get ('name'); $ email = Вход :: get ('email'); $ password = Hash :: make (Input :: get ('password')); $ user = new Пользователь; $ user-> name = $ name; $ user-> электронная почта = $ электронная почта; $ user-> пароль = $ пароль, $ user-> Save(); }); ' жаль, что я«не знаю, как показать код правильно здесь. – John

6

Ваш код пристанет, потому что вы передаете неправильные переменные Auth::attempt(). Этот метод требует массива с именем пользователя, паролем и, возможно, запоминанием. В этом свете ваш вышеуказанный код должен быть:

Route::post('login', function() 
{ 
    $credentials = [ 
     'username' => Input::get('email'), 
     'password' => Input::get('password') 
    ]; 

    dd(Auth::attempt($credentials)); 
}); 

Надеюсь, что это поможет.

Также я дам вам фрагменты дополнительного кода, чтобы улучшить ваш рабочий поток. Маршрут для хранения нового пользователя:

Route::post('register', function() 
{ 
    $input = Input::only(['username', 'email', 'password']); 

    // validate data 

    Eloquent::unguard(); 

    $user = User::create($input); 

    Auth::loginUsingId($user->id); 

    return Redirect::to('dashboard'); 
}); 

Затем в пользовательской модели добавьте метод

public function setPasswordAttribute() 
{ 
    $this->password = Hash::make($this->password); 
} 

Таким образом, пароль будет автоматически хэшированным каждый раз, когда он установлен

0

Вы должны реализовать UserInterface класс при условии, по laravel в вашем классе модели:

use Illuminate\Auth\UserInterface; 
use Illuminate\Auth\Reminders\RemindableInterface; 

class User extends Eloquent implements UserInterface, RemindableInterface 
{ 

И помните, что у него есть 2 абстрактных метода, которые вы должны объявить в своей модели. Вы можете следовать оригиналу User.php модель

0

Проверьте свой пароль Длина. Он должен быть 60 или выше в базе данных.

0

это не сработает, потому что auth :: попытка конвертирует пароль в хэш с помощью bcrypt и ищет этот хэш в таблице пользователей, чтобы соответствовать.

Короче говоря, пароль должен быть хэшем, хранящимся в таблице базы данных для auth :: пытаться работать.

вот почему ваш если() состояние неисправный.

вы можете использовать Bcrypt (пароль) для хранения пароля в виде хеша в базе данных, а затем использовать AUTH :: попытка

ниже от Laravel Docs

https://laravel.com/docs/5.2/authentication#authenticating-users

Метод попытка принимает массив пар ключ/значение в качестве первого аргумента . Значения в массиве будут использоваться для поиска пользователя в таблице вашей базы данных. Таким образом, в приведенном выше примере пользователь будет иметь значение , полученное значением столбца электронной почты. Если пользователь найден, то хэш-пароль , хранящийся в базе данных, будет сравниваться с значением пароля хэша , переданным методу через массив. Если два байта совпадают, то для пользователя будет запущен аутентифицированный сеанс.

Метод попытки вернет true, если аутентификация прошла успешно. В противном случае возвращается false.

Смежные вопросы