Laravel 4身份验证令牌不匹配

时间:2014-01-10 20:32:24

标签: php laravel-4

在过滤器文件中,我有以下内容:

Route::filter('auth', function()
{
    if (Auth::guest()) return Redirect::to('user/login');
});

这些是我在routes.php档案中的路线:

Route::group(['before' => 'auth'], function ()
{
    Route::resource('section', 'SectionController');
    Route::resource('article', 'ArticleController');
});

Route::controller('user', 'UserController');

UserController是执行操作的位置。在UserController内部,此方法处理登录表单帖子,该帖子是标准的Laravel刀片模板,没有正在使用的包:

刀片文件:

    {{ Form::open(['url' => 'user/signin']) }}
{{ Form::token() }}
    <div class="form-group">
        <label>{{ trans('user.email') }}</label>
        <input type="email" name="email" value="" class="form-control">
    </div>

    <div class="form-group">
        <label>{{ trans('user.password') }}</label>
        <input type="password" name="password" value="" class="form-control">
    </div>

    <input type="submit" class="btn btn-primary" value="{{ trans('login') }}">
                {{ Form::close() }}

这是UserController的帖子操作:

public function postSignin()
{
    //
    if (Auth::attempt(['email' => Input::get('email'), 'password' => Input::get('password')]))
    {
        return Auth::user()->email;
    }
    else
    {
        return Redirect::to('user/login')->with('message', trans('login.failure'));
    }
}

这是我使用的迁移文件:

public function up()
{
    //
    Schema::create('users', function ($table) {
        $table->increments('id');
        $table->string('email', 16)->unique();
        $table->string('password', 255);
        $table->timestamps();
    });
}

但是当我登录时,我得到一个例外:

Illuminate \ Session \ TokenMismatchException

抛出filters.php文件:

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

我做错了什么? Auth ::尝试哈希密码吗?它是用于生成root用户的Seeder中的Hashed。当我转储Session :: token()时,它与我的Form :: token()完全相同,但仍然会在filters.php文件中抛出TokenMismatchException。

更新 我禁用了csrf过滤器以便能够实际看到令牌。在我提交表单之前,两个标记Session :: token()和Form :: token()是相同的,我通过查看HTML源代码来检查它。当我提交表单并使用我的postSignin方法中的dd()转储标记时,Session :: token()已更改。它不再与HTML源代码中看到的Session :: token()相同。

return array(
    'driver' => 'array',
);

本地文件夹中的会话配置。

2 个答案:

答案 0 :(得分:1)

仅供参考 - 这不是身份验证问题 - 它与登录身份验证无关。

由于表单提交,这与CSRF令牌有关。在代码的某处,您必须调用CSRF过滤器。

将此添加到表单应该可以解决问题:

{{ Form::open(['url' => 'user/signin']) }}
    {{ Form::token() }}

    ....  /// rest of form stuff here 

{{ Form::close() }}

编辑:确保您的会话配置也正确无误。如果它被设置为'array'则不起作用。它应该是'文件'或其他选项。

答案 1 :(得分:0)

经过更多的摆弄后,我意识到解决方案是散列密码。在Laravel 4.1中,必须对密码进行哈希处理才能使Auth工作。

在数据库播种器中为密码添加哈希值,我可以登录