为什么在Laravel中无法使用登出路线?

问题描述 投票:1回答:7

当我尝试从管理面板注销时出现错误:

MethodNotAllowedHttpException in RouteCollection.php line 218:

但是在路由中有路由logout

POST | logout |  App\Http\Controllers\Auth\LoginController@logout | web  

我怎样才能解决这个问题?

laravel laravel-5.2 laravel-5.3
7个回答
4
投票

如果您已升级到Laravel 5.3,则在升级过程中有意删除了get注销路由。

POST登出

Auth :: routes方法现在为/ logout注册了POST路由,而不是GET路由。 这样可以防止其他Web应用程序将您的用户注销。 要进行升级,您应该将注销请求转换为使用POST动词,或者为/ logout URI注册自己的GET路由

https://laravel.com/docs/5.3/upgrade

您需要将所有注销链接更改为表单,以便它可以发布到路由。 从https://github.com/acacha/adminlte-laravel/issues/94 ,类似:

<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>

资源


3
投票

您需要执行以下步骤:

1.-如果您正在使用由您创建的登录类,请在config / auth.php中指定它:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Administrator::class,
    ],
],

2.-您的模型必须继承自Authenticateable类:

use Illuminate\Foundation\Auth\User as Authenticatable;
class Administrator extends Authenticatable{
    #code...
}

3.-在您的LoginController上添加logout()函数,导入AuthRedirect

public function logout(){
    Auth::logout();
    return Redirect::to('admin');
}

3.-指定用于通过GET注销的路由

Route::get('logout','LoginController@logout');

就是这样,这应该可行。

注意:检查您是否通过功能Auth::check()进行身份Auth::check()

附加信息:在处理POST请求时,Laravel需要验证该请求不是恶意请求,因为此Laravel需要加密的代码,称为csrf_token ,如果不发送,则默认情况下所有请求将不会被允许。


1
投票

是您在Auth文件夹或Controllers文件夹中的LoginController。.也许您输入的路径是错误的..如果LoginController在Controllers文件夹中,则路径应为Route :: get('logout','App \\ Http \\ Controllers \\ LoginController @登出');


0
投票

您正在尝试使用GET访问POST路由。

你可以:
-使用POST创建ajax请求
-将按钮包装在POST表单中
-创建一个额外的GET -route到App\\Http\\Controllers\\Auth\\LoginController@logout


0
投票

您正在对POST路由执行GET请求。 创建或修改现有路由以接受GET请求(大多数情况下,通过链接进行的重定向是GET请求)


0
投票

更换

<a href="{{ url('/logout') }}" class="btn btn-default btn-flat">{{ trans('adminlte_lang::message.signout') }}</a>

<a href="{{ url('/logout') }}" class="btn btn-default btn-flat" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"> {{ trans('adminlte_lang::message.signout') }} </a>

<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">{{ csrf_field() }} </form>

在mainheader.blade.php中,它将解决。


0
投票

只需将其添加到路由文件即可:

Route::get('/logout' , 'Auth\LoginController@logout');
© www.soinside.com 2019 - 2024. All rights reserved.