使用Laravel可以使用外部用户数据库绕过remember_token的需要

时间:2014-07-30 14:14:36

标签: laravel laravel-4

最近更新了Laravel,他们需要remember_token和updated_at。

登录和退出时,我得到:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'remember_token' in 'field list' (SQL: update `account` set `remember_token` = s8XPDCdNdJnjbLj7MlDRO1Cy5owwjxdfW1rYVhd6QpePIltqPkavr9l3KUbd, `updated_at` = 2014-07-30 14:09:37 where `id` = 5)

我正在使用外部用户数据库,我不想创建这些额外的字段,因为它也用在我不想搞砸的游戏服务器上。

有没有办法绕过对这两列的需求?

3 个答案:

答案 0 :(得分:2)

我很确定使用Laravel内置的Auth系统(Guard)可以让你使用UserInterface,而后者又可以让你定义这些。但是,您可以通过使用这些方法伪造它,但让它们返回无用的信息。

<?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;

    protected $hidden = array('password', 'remember_token');
    public $timestamps = false;

    public function getRememberToken()
    {
        return '';
    }

    public function setRememberToken($value)
    {
    }

    public function getRememberTokenName()
    {
        // just anything that's not actually on the model
        return 'trash_attribute';
    }

    /**
     * Fake attribute setter so that Guard doesn't complain about
     * a property not existing that it tries to set.
     *
     * Does nothing, obviously.
     */
    public function setTrashAttributeAttribute($value)
    {
    }
}

这可能只是做你想要的 - 基本上覆盖这些功能不能正常工作,这意味着1)你不需要弄乱你的数据库和2)当功能不起作用时它没关系,因为你'反正还没有使用它。


正如@neeraj所说,对created_at事,只做$timestamps = false并希望最好。更新了上面的模型以反映这一点。

答案 1 :(得分:2)

是的,这是可能的。此代码应该允许您避免使用&#39; remember_token&#39;在您的用户表中

public function getRememberToken()
{
    return null; // will not support
}

/**
 * Set the token value for the "remember me" session.
 *
 * @param  string  $value
 * @return void
 */
public function setRememberToken($value)
{
    // will not support
}

/**
 * Get the column name for the "remember me" token.
 *
 * @return string
 */
public function getRememberTokenName()
{
    return null; // will not support
}

public function setAttribute($key, $value)
{
    $isRememberTokenAttribute = $key == $this->getRememberTokenName();

    if( ! $isRememberTokenAttribute )
    {
        parent::setAttribute($key, $value);
    }
}

答案 2 :(得分:1)

尝试从模式中删除以下界面

RemindableInterface

对于created_at和updated_at,您可以在模态中编写以下行:

public $timestamps = false;

例如,如果你的模态名称是Admin,那么代码应该是

class Admin extends Eloquent implements UserInterface
{

    public $timestamps = false;
}