为什么Laravel的登出路线不起作用?

时间:2016-09-06 07:22:20

标签: laravel laravel-5.2 laravel-5.3

当我尝试从管理面板注销时,我收到错误:

MethodNotAllowedHttpException in RouteCollection.php line 218:

但在路由中有路由​​logout

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

我该如何解决这个问题?

7 个答案:

答案 0 :(得分:4)

如果您已升级到Laravel 5.3,则在升级过程中会有目的地删除get logout路由。

  

POST退出

     

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

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

您需要将所有注销链接更改为表单,以便它可以POST到路由。来自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>

Source

答案 1 :(得分:3)

您需要执行以下步骤:

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

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

2.-您的模型必须继承自 Authenticatable

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

3.-在LoginController上添加logout()函数,导入 Auth Redirect

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

3.-指定您将用于通过GET注销的路线

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

这就是全部,这应该有用。

注意:检查您是否通过函数Auth::check()

进行了身份验证

其他信息:当您处理POST请求时,Laravel需要验证请求不是恶意请求,因为此Laravel需要一个ecrypted代码,这称为 csrf_token < / strong>,如果您不发送此消息,则默认情况下不会允许您的所有请求。

答案 2 :(得分:1)

是Auth文件夹或Controllers文件夹中的LoginController。 也许你正在给出错误的道路...... 如果LoginController在Controllers文件夹中,则Path应为  路由:: get(&#39;退出&#39;,&#39; App \ Http \ Controllers \ LoginController @ logout&#39;);

答案 3 :(得分:0)

您尝试使用POST访问GET路线。

你可以:
  - 使用POST创建ajax请求   - 以POST - 形式包裹按钮   - 创建一个额外的GET - 路由到App\Http\Controllers\Auth\LoginController@logout

答案 4 :(得分:0)

您正在对ss路由发出GET个请求。创建或修改现有路由以接受POST请求(通过链接重定向是GET请求(大多数时间))

答案 5 :(得分: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中,它将修复。

答案 6 :(得分:0)

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

grant connect to readwrite