2014-01-10 48 views
1

在过滤器文件中,我有以下: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中的哈希。当我转储Session :: token()时,它与我的Form :: token()相同,但是仍然会在filters.php文件中引发TokenMismatchException。

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

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

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

+0

也请发表您的刀片文件。如果你使用'{{Form :: open()}}'csrf隐藏字段会自动添加,如果你手工创建了表单,它不会,除非你添加它;但是之后我们需要看看你是如何格式化它的。 – Luceos

+0

@Luceos刀片文件已添加。标准刀片模板,csrf自动设置。 –

+0

哦,我明白了;这个错误是由“香草”拉拉维尔造成的? – Luceos

回答

1

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

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

添加以下内容到形式应该解决的问题:

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

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

{{ Form::close() }} 

编辑:确保您的会话配置也是正确的。如果它被设置为'数组',它将无法工作。它应该是'文件'或其他选项。

+0

我将此添加到登录表单中,仍然抛出TokenMismatchException异常。检查页面的源代码当我添加Form :: token()时,我得到2个相同的标记 - 它已经存在,由Laravel添加。 –

+0

会话有问题吗?什么是你的会话配置? – Laurence

+2

会话被设置为数组,难怪在请求中它不是完全相同的,它不是持久的。 –

0

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

添加一个哈希在DB播种机的密码,我可以登录