在过滤器文件中,我有以下内容:
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',
);
本地文件夹中的会话配置。
答案 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工作。
在数据库播种器中为密码添加哈希值,我可以登录