2014-01-10 57 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播種機的密碼,我可以登錄