【发布时间】:2017-02-21 04:07:06
【问题描述】:
当我登录我的应用程序时,当我进入它时立即返回,然后尝试注销,我从标题中得到错误,我该如何解决?
【问题讨论】:
标签: laravel-5.3
当我登录我的应用程序时,当我进入它时立即返回,然后尝试注销,我从标题中得到错误,我该如何解决?
【问题讨论】:
标签: laravel-5.3
我遇到了这个问题,因为我为我的本地主机设置了 'secure' => env('SESSION_SECURE_COOKIE', false), 为 true。该值位于project-folder/config/session.php 文件中。由于我的本地主机不是https,这就是我面临这个问题的原因。在为我的本地主机设置false 后,问题就消失了。
【讨论】:
开箱即用,Laravel 带有 web 和 api 中间件组,其中包含您可能希望应用于 web UI 和 API 路由的常用中间件
如果您检查您的app/Providers/RouteServiceProvider.php,您会发现默认情况下,web 中间件组应用于您在routes/web.php 中的所有路由。
protected function mapWebRoutes()
{
Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
], function ($router) {
require base_path('routes/web.php');
});
}
现在,如果您检查您的app/Http/Kernel.php 并查看$middlewareGroups 属性,您会发现一个新的EncryptCookies 中间件。您可以阅读它,但如果您从 web 中间件组中删除此中间件,您的应用可能不会提供您当前获得的 TokenMismatchException。
【讨论】:
当我的APP_URL 是APP_URL=http://localhost 时,我在我的.env 文件中添加了SESSION_DOMAIN=localhost。它适用于我我使用laravel 5.3
【讨论】:
Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php
使用闭包; // 导入
protected $except = [
//
];
public function handle($request, Closure $next)
{
$response = $next($request);
if (last(explode('\\',get_class($response))) != 'RedirectResponse') {
$response->header('P3P', 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
}
return $response;
}
或
所有网址
protected $except = [
'*'
];
或
如果没有用
Illuminate\Foundation\Http\Kernel.php
// \App\Http\Middleware\VerifyCsrfToken::class
此行添加注释
【讨论】:
为了解决这个问题,在路由文件中添加这两行(例如 web.php)
Route::get('/', 'HomeController@index');// so when you logged out it go back
Route::get('/home', 'HomeController@index');
这解决了我的问题。希望有所帮助。
【讨论】:
这个问题一般会因为权限问题。正如 Manish 所指出的,您可以在会话文件夹中 chmod 777,但是,我永远不会推荐这样做。首先检查您是否对使用 artisan serve 的应用程序有同样的问题(而不是通过 Nginx 或 Apache 为您的应用程序提供服务)。如果您不这样做,那么这是一个权限问题,您可以相应地更改文件夹的所有权。很可能是 www-data 用户需要写入文件夹的权限,但是,您需要检查您的环境以确保用户在某些情况下会有所不同。
【讨论】:
我遇到了同样的问题。
我使用IIS 在 Windows 机器上运行 Laravel / PHP。如果您也这样做,请确保用户 IUSR 对项目目录具有修改权限。
允许用户后,错误消失了。
【讨论】:
实际上我在 Laravel 5.4 中遇到了同样的问题,当我使用表单上传文件时,我发送了令牌并且文件正确上传。当我上传超过最大文件大小上传的文件时,会出现此问题。因此,只需在 VerifyCsrfToken.php 中为路由添加一个异常,消息就会消失,但文件不会上传。
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
protected $except = [
'anexoSesion',
];
public function handle($request, Closure $next)
{
return parent::handle($request, $next);
}
}
【讨论】:
我在使用 laravel5.4 for rest API 时也遇到了这个问题。只需将路由名称添加到 app/Http/Middleware/VerifyCsrfToken.php 文件中即可。
protected $except = [
'test/login',
];
添加该行后,我运行API,它执行成功。
【讨论】:
我在使用 laravel 5.4 时遇到了同样的问题 .. 然后下面的命令对我有用 :)
chmod 777 存储/框架/会话/
在此之前,它是 chmod 775 storage/framework/sessions/ ...因此我遇到了问题...
愉快的编码
【讨论】:
chmod 777 is a bad idea。您正在授予 ANYONE 在该文件夹上写入的权限。如果有人获得该文件夹的访问权限并上传脚本以列出所有用户或删除用户表怎么办?
我通过编辑文件 config->session.php
解决了这个问题'domain' => env('SESSION_DOMAIN', null),
并从文件 (.env) 中删除 SESSION_DOMAIN
最后是 composer dumpautoload
【讨论】:
我在 5.3.29 版本中遇到过这种问题 以下方法对我有用。
只需更改 .env 文件中的以下行。
APP_KEY=base64:aBCdeFghI+jKLMnOPqRSTuvw1xYzAbCDeFgHiJKL57+4= (example key)
去掉 base64: 部分,让它像下面一样
APP_KEY=aBCdeFghI+jKLMnOPqRSTuvw1xYzAbCDeFgHiJKL57+4=
【讨论】:
转到middleware -> verifycsrftoken.php -> 在指定的数组中添加url。
【讨论】:
来自 Laravel 5.3 文档
Auth::routes 方法现在为 /logout 注册一个 POST 路由,而不是一个 GET 路由。这可以防止其他 Web 应用程序将您的用户从您的应用程序中注销。要升级,您应该将注销请求转换为使用 POST 动词或为 /logout URI 注册自己的 GET 路由:
选项一:
Route::get('/logout', 'Auth\LoginController@logout');
有关升级的更多信息,请查看https://laravel.com/docs/5.3/upgrade
选项 2
//Insert this on your head section
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<!-- Scripts -->
<script>
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>
</script>
你想在哪里登出
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ url('/logout') }}" onclick="event.preventDefault();
document.getElementById('logout-form').submit();"> Logout
</a>
<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
干杯
【讨论】:
window.Laravel = "<?php echo json_encode(['csrfToken' => csrf_token(), ]); ?>",即把它们放在同一行