【问题标题】:laravel 4.2 and remember me updatelaravel 4.2 并记住我更新
【发布时间】:2014-06-01 19:36:28
【问题描述】:

我将getRememberToken、setRememberToken、getRememberTokenName添加到用户模型,将“remember_token”列添加到用户数据库,运行composer update。

结果:没有错误,使用记住我选项登录与以前一样 - DB 中的“remember_token”仍然为空。 + 我在Illuminate\Auth\UserProviderInterface 中看不到retrieveByToken()updateRememberToken()

出了什么问题? 我做了还是没做某事?出于某种原因,作曲家没有像它应该的那样使用 "laravel/framework": "4.2.*" 吗? v4.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';
    }           
   }

【问题讨论】:

  • 您的 User 模型是否直接扩展了 Eloquent 类?您可以发布您的完整用户模型代码吗?
  • 已添加。那么在作曲家更新后没有 retrieveByToken() 和 updateRememberToken() 的 Illuminate\Auth\UserProviderInterface 呢?为什么它不自动出现?
  • 您的模型看起来不错。我以前没有注意到这一点,但是 Laravel 4.2 还没有发布,你应该将 composer.json 更改为“laravel/framework”:“4.1.*”,然后运行“composer update”
  • 是的,在浏览器降级修复问题中删除cookies后。好吧,它接缝我不会再玩开发版了:) tnx

标签: php authentication laravel laravel-4 remember-me


【解决方案1】:

这是我的 User Laravel 开发模型:

<?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,另一个来自RemindableTrait
  • composer.json 中,您需要将minimum-stability 设置为dev,然后设置php composer.phar update(或者,如果您遇到像我经常遇到的内存错误,rm -rf vendor/ &amp;&amp; php composer.phar install)。请注意,beta 目前不适用于上述用户模型,因为自 BETA1 发布以来,RemindableTrait 实际上已被移动;所以我推荐dev 分支,直到4.2.0-BETA2 发布。
  • 另请注意,目前有laravel/framework4.2.0-BETA1 版本,但没有laravel/laravel4.2.* 版本。因此,如果您尝试(就像我在很长一段时间内徒劳无功)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('/');
        }
    }

}

【讨论】:

    【解决方案2】:

    请在本帖末尾查看我的答案!

    http://laravel.io/forum/04-21-2014-remember-token.

    如果您查看 Guard.php 文件,则缺少 regenerating-token 功能。

    【讨论】:

      【解决方案3】:

      Laravel 4.2 记住我的步骤:

      1- 用于检查登录的主用户表必须在 schema 中有 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)这行代码应该可以记住我

      【讨论】:

        【解决方案4】:

        我正在使用 Laravel 4.2;我在我的登录视图中输入了name="rememberme",并在我的控制器中使用以下代码:

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

        效果很好;一旦我登录,我的会话在我明确退出之前不会结束。

        【讨论】:

          猜你喜欢
          • 2015-12-17
          • 2015-07-13
          • 1970-01-01
          • 2012-01-28
          • 1970-01-01
          • 2015-02-15
          • 2020-12-24
          • 2014-04-20
          • 1970-01-01
          相关资源
          最近更新 更多