【发布时间】:2014-06-17 15:58:34
【问题描述】:
在过滤器文件中,我有以下内容:
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::attempt 是否对密码进行哈希处理?它在我用来生成 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',
);
本地文件夹中的会话配置。
【问题讨论】:
-
请同时发布您的刀片文件。如果你使用
{{ Form::open() }},csrf隐藏字段是自动添加的,如果是手动创建的则不会,除非你添加了;但是我们需要看看你是如何格式化的。 -
@Luceos 刀片文件已添加。标准刀片模板,csrf自动设置。
-
哦,我明白了;此错误是由“香草”laravel 引起的?
-
您在使用 APC(请参阅:stackoverflow.com/questions/20129864/…)
-
是的,香草 laravel。我没有使用 APC。除了文档中描述的 local/database.php 之外,我没有更改设置中的任何内容。