laravel 4.2 и обновление «помни меня»

Я добавляю getRememberToken, setRememberToken, getRememberTokenName в модель пользователя, добавляю столбец «remember_token» в пользовательскую БД, запускаю обновление композитора.

Результат: ошибок нет, вход с опцией "запомнить меня" проходит так же, как и раньше - "remember_token" в БД по-прежнему нулевой. + я не вижу retrieveByToken() и updateRememberToken() в Illuminate\Auth\UserProviderInterface

Что пойдет не так? Я что-то сделал или не сделал? Composer почему-то не идет с "laravel/framework": "4.2.*" как надо? В версии 4.2 не было решения проблемы с запоминанием меня? Auth::attempt() следует как-то изменить, чтобы генерировать и помещать данные в Remember_token? Auth::logout() не трогая Remember_token (я ввожу случайные данные, и они остаются одинаковыми после выхода из системы и входа в систему с функцией «Запомнить меня» или без нее) Куда копать?

    <?php

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

    class User extends Eloquent implements UserInterface, RemindableInterface {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';
    protected $fillable = ['name','email','password','temp_password','code','status', 'remember_token'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password');

    /**
     * Get the unique identifier for the user.
     *
     * @return mixed
     */
    public function getAuthIdentifier()
    {
            return $this->getKey();
    }

    /**
     * Get the password for the user.
     *
     * @return string
     */
    public function getAuthPassword()
    {
            return $this->password;
    }

    /**
     * Get the e-mail address where password reminders are sent.
     *
     * @return string
     */
    public function getReminderEmail()
    {
            return $this->email;
    }

    public function scopeCode($query, $code)
    {
            return $query->whereCode($code);
    }

    public function scopeEmail($query, $email)
    {
            return $query->whereEmail($email);
    }

    public function getRememberToken()
    {
        return $this->remember_token;
    }

    public function setRememberToken($value)
    {
        $this->remember_token = $value;
    }

    public function getRememberTokenName()
    {
        return 'remember_token';
    }           
   }

person user2020432    schedule 17.04.2014    source источник
comment
Ваша модель User напрямую расширяет класс Eloquent? Можете ли вы опубликовать свой полный код модели пользователя?   -  person Designated    schedule 17.04.2014
comment
Добавлен. А как насчет Illuminate\Auth\UserProviderInterface без retrieveByToken() и updateRememberToken() после обновления композитора? Почему его нет автоматически?   -  person user2020432    schedule 17.04.2014
comment
Ваша модель выглядит нормально. Я не замечал этого раньше, но Laravel 4.2 еще не вышел, вам следует изменить composer.json на laravel/framework: 4.1.* и запустить composer update   -  person Designated    schedule 17.04.2014
comment
да, после удаления куки в браузере понизить версию решить проблему. Что ж, похоже, я больше не буду играть с версией для разработчиков :) tnx   -  person user2020432    schedule 17.04.2014


Ответы (4)


Вот моя модель User для Laravel dev:

<?php

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

class User extends Eloquent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password');

    protected $fillable = array('email', 'password');

}

Куча вещей, чтобы отметить здесь:

  • Черты! Пять ваших методов действительно должны исходить из UserTrait, а еще один из < a href="http://laravel.com/api/master/Illuminate/Auth/RemindableTrait.html" rel="nofollow">RemindableTrait.
  • В composer.json вам нужно будет установить minimum-stability в dev, а затем php composer.phar update (или, если вы сталкиваетесь с ошибками памяти, как это часто делаю я, rm -rf vendor/ && php composer.phar install). Обратите внимание, что beta в настоящее время не будет работать с указанной выше пользовательской моделью, потому что RemindableTrait фактически была перемещена после выпуска BETA1; так что рекомендую ветку dev до выхода 4.2.0-BETA2.
  • Также обратите внимание, что в настоящее время существует 4.2.0-BETA1 версия laravel/framework, но нет 4.2.* версии laravel/laravel. Так что, если вы попытаетесь (как и я, довольно долгое время, тщетно) получить create-project laravel/laravel --stability=beta, вы продолжите получать 4.1.* прямо сейчас, даже несмотря на то, что бета-версия 4.2 вышла. Все очень запутанно.

Наконец, не забудьте свою пользовательскую схему (заглушка на php artisan auth:reminders-table):

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('email')->unique();
            $table->string('password');
            $table->string('remember_token', 100)->nullable();
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }

}

И ваш контроллер напоминаний (заглушка на php artisan auth:reminders-controller):

<?php

class RemindersController extends Controller {

    /**
     * Display the password reminder view.
     *
     * @return Response
     */
    public function getRemind()
    {
        return View::make('password.remind');
    }

    /**
     * Handle a POST request to remind a user of their password.
     *
     * @return Response
     */
    public function postRemind()
    {
        switch ($response = Password::remind(Input::only('email')))
        {
            case Password::INVALID_USER:
                return Redirect::back()->with('error', Lang::get($response));

            case Password::REMINDER_SENT:
                return Redirect::back()->with('status', Lang::get($response));
        }
    }

    /**
     * Display the password reset view for the given token.
     *
     * @param  string  $token
     * @return Response
     */
    public function getReset($token = null)
    {
        if (is_null($token)) App::abort(404);

        return View::make('password.reset')->with('token', $token);
    }

    /**
     * Handle a POST request to reset a user's password.
     *
     * @return Response
     */
    public function postReset()
    {
        $credentials = Input::only(
            'email', 'password', 'password_confirmation', 'token'
        );

        $response = Password::reset($credentials, function($user, $password)
        {
            $user->password = Hash::make($password);

            $user->save();
        });

        switch ($response)
        {
            case Password::INVALID_PASSWORD:
            case Password::INVALID_TOKEN:
            case Password::INVALID_USER:
                return Redirect::back()->with('error', Lang::get($response));

            case Password::PASSWORD_RESET:
                return Redirect::to('/');
        }
    }

}
person Aaron Adams    schedule 30.05.2014


Laravel 4.2 Запомнить меня шаги:

1- таблица вашего основного пользователя, которая использовалась для проверки входа в систему, должна иметь RememberToken() в схеме

Schema::create('Users',function($table)
{
    $table->increments('id');
    $table->string('email');
    $table->string('password');
    $table->bigInteger('organizer_id');
    $table->boolean('status');
    $table->rememberToken();
    $table->timestamps();
    $table->softDeletes();

});

2- Вид: флажок для запомнить меня, как у меня

{{Form::label('remember','Remember Me')}}

3- Контроллер входа в систему:

if (\Auth::attempt(array('email'=>Input::get('email'), 'password'=>Input::get('password') ), (Input::get('remember')==1 ? true : false)))
{
   return Redirect::to('_admin/home')->with('message', 'You are now logged in!');
} else {
  return \Redirect::back()
    ->with('message', 'Your username/password combination was incorrect')
    ->withInput();
}

(Input::get('remember')==1 ? true : false) эта строка кода должна работать, чтобы запомнить меня

person Muhammad    schedule 03.12.2014

Я использую Laravel 4.2; У меня есть вход с name="rememberme" в моем представлении входа со следующим кодом в моем контроллере:

if(Auth::attempt($logindata, Input::has('rememberme'))) 
{
    return Redirect::intended('/');
} 

Он отлично работает; как только я войду в систему, мой сеанс не закончится, пока я явно не выйду из системы.

person PeterKA    schedule 05.08.2014