我遵循了使用Laravel创建注册和登录页面的this教程。
一切顺利,唯一的问题是我无法登录。如果我提供了错误的用户名/密码,它会正确地给我一个错误消息。但如果我使用正确的凭据,我会收到以下错误 -
Illuminate \ Session \ TokenMismatchException
这是我的(默认)csrf函数 -
Route::filter('csrf', function()
{
if (Session::token() != Input::get('_token'))
{
throw new Illuminate\Session\TokenMismatchException;
}
});
这是表单操作 -
{{ Form::open(array('url'=>'signin', 'class'=>'form-signin')) }}
这是我的UsersController的相关部分
public function __construct() {
$this->beforeFilter('csrf', array('on'=>'post'));
$this->beforeFilter('auth', array('only'=>array('getDashboard')));
}
public function postSignin() {
if (Auth::attempt(array('email'=>Input::get('email'), 'password'=>Input::get('password')))) {
return Redirect::to('dashboard')->with('message', 'You are now logged in!');
} else {
return Redirect::to('login')
->with('message', 'Your username/password combination was incorrect')
->withInput();
}
}
public function getDashboard() {
$this->layout->content = View::make('users.dashboard');
}
答案 0 :(得分:3)
Laravel对会话进行了相当深奥的使用,当存储在数据库中的用户cookie和用户salt由于某种原因(例如,当您重新设置用户表时)时,会出现令牌不匹配异常没有进一步解释。
如果是这种情况,请删除您的Cookie。
答案 1 :(得分:1)
我在登录时遇到了这个问题。这个异常不时发生,所以我停下来试图重现它。这样做我成功了:
首先我加载登录页面。
然后我删除了cookie。
然后,在没有重新加载登录页面的情况下,我输入了用户名和密码并尝试登录。
因为会话被删除了(当我删除cookie时),这段代码不会通过是正常的,它会抛出TokenMismatchException。
Route::filter('csrf', function() {
if ( Session::getToken() != Input::get('_token')) {
throw new Illuminate\Session\TokenMismatchException;
}
});
所以,我为解决我的问题所做的是添加一个重定向到登录页面,并带有一条消息通知用户该会话可能已过期。
Route::filter('csrf', function() {
if ( Session::getToken() != Input::get('_token')) {
return Redirect::to('/admin/login')->with('warning', 'Your session has expired. Please try logging in again.');
}
});
因此,在页面重新加载后,会创建一个新会话并解决问题。
答案 2 :(得分:1)
检查您的路由:列表以查看Login是否受Web中间件保护。在我的情况下,我错误地将web middileware添加到登录路由,它应该是访客中间件。
答案 3 :(得分:0)
我遇到了这个问题,原因是没有可用的磁盘空间。
获取一些空间并尝试重新登录。
答案 4 :(得分:0)
我将以下代码添加到app\Exceptions\Handler.php
中,以帮助澄清最终用户的错误,除了将会话设置为在关闭时到期,如该线程中所述。
protected function prepareException(Exception $exception)
{
if ($exception instanceof TokenMismatchException) {
return new HttpException(
419,
"{$exception->getMessage()}. Please clear your browser cookies and try again.",
$exception
);
}
return parent::prepareException($exception);
}