如何使用Laravel 5.4注销并重定向到登录页面?

时间:2017-04-24 10:14:55

标签: php laravel-5.4

我正在使用Laravel 5.4并尝试实现身份验证系统。我使用php artisan命令make:auth来设置它。我根据我的布局编辑了视图。现在,当我试图注销它时,把这个错误抛给了我

RouteCollection.php第161行中的NotFoundHttpException:

任何人都可以帮我注销吗?

11 个答案:

答案 0 :(得分:88)

web.php(路线)中:

添加

Route::get('logout', '\App\Http\Controllers\Auth\LoginController@logout');

LoginController.php

添加

public function logout(Request $request) {
  Auth::logout();
  return redirect('/login');
}

此外,在LoginController.php之后的namespace

之后

添加

use Auth;
use Illuminate\Http\Request;

现在,您可以使用yourdomain.com/logout网址退出,或者如果您已创建logout button,请将href添加到/logout

答案 1 :(得分:37)

即使@Tauras的建议有效,我也不认为这是解决这个问题的正确方法。

你说你已经运行了php artisan make:auth,它应该在Auth::routes();路由文件中插入routes/web.php。其中包含已定义的默认logout路由,其名称为logout

您可以see it here on GitHub,但为了简单起见,我还会在此处报告代码:

    /**
     * Register the typical authentication routes for an application.
     *
     * @return void
     */
    public function auth()
    {
        // Authentication Routes...
        $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
        $this->post('login', 'Auth\LoginController@login');
        $this->post('logout', 'Auth\LoginController@logout')->name('logout');
        // Registration Routes...
        $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
        $this->post('register', 'Auth\RegisterController@register');
        // Password Reset Routes...
        $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
        $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
        $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
        $this->post('password/reset', 'Auth\ResetPasswordController@reset');
    }

然后请再次注意logout 需要 POST作为HTTP请求方法。这背后有许多正当理由,但仅举一个非常重要的是,通过这种方式,您可以阻止跨站点请求伪造

所以根据我刚刚指出的,实现这个的正确方法可能就是这样:

<a href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('frm-logout').submit();">
    Logout
</a>    
<form id="frm-logout" action="{{ route('logout') }}" method="POST" style="display: none;">
    {{ csrf_field() }}
</form>

最后请注意,我已经插入了laravel开箱即用函数{{ csrf_field() }}

答案 2 :(得分:7)

您可以在控制器中使用以下内容:

return redirect('login')->with(Auth::logout());

答案 3 :(得分:4)

Laravel 5.8的最佳方法

100%工作

在您的 Auth \ LoginController.php

中添加此功能
$.ajax({
        type: "POST",
        url: '/Home/CreateCarouselItem',
        dataType: "text",
        data: {itemText: boxText },
        traditional: true,
        success: function (data) {
            console.log(data);
        },
        error: console.log("it did not work"),
    });

还要添加

use Illuminate\Http\Request;

答案 4 :(得分:2)

这是通过在路由

中调用Auth :: logout()来实现此目的的另一种方法
Route::get('/logout', function(){
   Auth::logout();
   return Redirect::to('login');
});

答案 5 :(得分:1)

在5.5

添加

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

到我的路线文件工作正常。

答案 6 :(得分:1)

我建议您在web.php中坚持使用Laravel身份验证路由:Auth::routes()

它将创建以下路线:

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

您将需要使用POST表单注销。这样,您还需要推荐的CSRF令牌。

<form method="POST" action="{{ route('logout') }}">
  @csrf
  <button type="submit">Logout</button>
</form>

答案 7 :(得分:1)

在Laravel 6.2中

将以下路由添加到: web.php

Route::post('logout', 'Auth\LoginController@logout')->name('logout');

使用Achor标记并通过POST表单注销。这样,您还将需要CSRF令牌。

 <a class="log-out-btn" href="#" onclick="event.preventDefault();document.getElementById('logout-form').submit();"> Logout </a>

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

答案 8 :(得分:0)

将以下代码添加到LoginController.php中更好,更安全,该代码仅在标准注销后运行:

use AuthenticatesUsers;

protected function loggedOut(Request $request)
    {
        return redirect('/new/redirect/you/want');
    }

答案 9 :(得分:0)

如果您希望在特定条件下通过代码实现此目标,那么这是为我工作的解决方案。我在中间件中使用过,以阻止某些用户: 下面这些行是注销的实际代码:

$auth = new LoginController();
$auth->logout($request);

完整文件:

namespace App\Http\Middleware;
use Closure;
use Auth;
use App\Http\Controllers\Auth\LoginController;
class ExcludeCustomers{
    public function handle($request, Closure $next){
        $user = Auth::guard()->user();
        if( $user->role == 3 ) {
            $auth = new LoginController();
            $auth->logout($request);
            header("Location: https://google.com");
            die();
        } 
        return $next($request);
    }
}

答案 10 :(得分:-2)

如果您在5.5中使用了auth脚手架,只需将href指向:

即可
{{ route('logout') }}

无需更改任何路线或控制器。