31                    

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

RouteCollection.php第161行中的NotFoundHttpException:                    

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

改善这个问题                            
       

8答案 正确答案                

 活跃的最老                    
       
100                        

在你的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/logoutURL 注销,或者如果已创建logout button,请将href添加到/logout                        

改善这个答案                            
  • 非常感谢Tauras,它的工作原理:) -  Y.EzzEldin 2017年 4月25日16:59                                    
  • 像魅力一样工作!谢谢,, -  Muzafar Ali 17年7月20日在6:58                                    
  • 1                                    
    为什么不使用laravel预制auth routes -  Sid 于17年3月3日在10:36                                    
  • 2                                    
    我发现这已经不够了,你还应该添加$request->session()->invalidate();到注销功能 - 这可以防止我遇到的一些奇怪的场景。 -   于18年1月18日1:46                                    
  • 1                                    
    有用!但@Sid以下答案是最好的(也是最快的)选项 - gtamborero 18年  9月19日8:27                                    
       
41                        

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

你说你已经运行了php artisan make:auth哪些应该也插入Auth::routes();你的routes/web.php路由文件中。其中logout已经定义了默认路由,并且已命名logout                        

你可以在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() }}                        

改善这个答案                            
  • 不推荐使用事件字段; 要替换什么? -  Ho3ein_Indeed 8月3日7:38                                    
       
8                        

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

return redirect('login')->with(Auth::logout());
                   
改善这个答案                            
  • 这应该是一个公认的答案。奇迹般有效! - willbeeler 18年  8月28日19:31                                    
       
3                        

这是通过在路由中调用Auth :: logout()来实现它的另一种方法                        

Route::get('/logout', function(){
   Auth::logout();
   return Redirect::to('login');
});
                   
改善这个答案                            
       
1                        

在5.5                        

加入                        

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

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

改善这个答案                            
  • 不要这样做,看看Sid的回应。其他网站可以登录用户,同时将某人重定向到domain.com/logout - kendepelchin 18年  2月21日19:34                                    
  • 哦很高兴知道 - Beefjeff 18年  2月21日22:25                                    
       
1                        

我建议你坚持使用web.php中的Laravel auth路由: 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>
                   
改善这个答案                            
       
0                        

Laravel 5.8的最佳方式                        

100%工作                        

Auth \ LoginController.php中添加此函数                        

use Illuminate\Http\Request;
                       

并且还添加了这个                        

public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->invalidate();

    return $this->loggedOut($request) ?: redirect('/login');
}
                   
改善这个答案                            
       
-2                        

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

{{ route('logout') }}
                       

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

改善这个答案                            
  • 当我尝试它时不起作用。Laravel抛出错误Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message -  Bariq Dharmawan 于18年3月20日4:32                                    
  • @BariqDharmawan这是因为注销路由是一个POST路由,这意味着你必须把它放在一个表单中。例如,方法=“POST”action =“{{route('logout')}}” - willbeeler 18年  8月28日19:30                                    
       

来自  https://stackoverflow.com/questions/43585416/how-to-logout-and-redirect-to-login-page-using-laravel-5-4/49420435            


           

德拉德尔斯的化身                
德拉德尔                        
2年前                        
2815                            
7                            
LARAVEL                        

注销后laravel 5.5重定向                    

我试图在用户点击注销链接后将用户重定向到登录页面,但这似乎不起作用(以前用于工作)。我在这里和网上尝试了很多解决方案,但仍然如此。                        

web.php                        

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

                       

LoginController.php                        

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Auth;
use Illuminate\Http\Request;

class LoginController extends Controller
{


    use AuthenticatesUsers;

    protected $redirectTo = '/home';


    public function __construct()
    {
        $this->middleware('guest')->except('logout');

         // $this->middleware('guest', ['except' => ['logout', 'logout']]);
    }

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

                       

nav.blade.php                        

      <ul class="right hide-on-med-and-down center-align">
        <li><a href="/">HOME</a></li>
        <li><a href="{{ route('logout') }}">LOGOUT</a></li>
      </ul>

                   
tisuchi                                
等级50                                    
tisuchi2年前                                        

你试过这个吗?                                    

Route::get('logout', 'Auth\LoginController@logout')->name('logout');
                               
Snapey                                
等级50                                    
Snapey2年前                                        

你的web.php中还有标准的auth :: routes()吗?例如,你有多个登出路线吗?                                    

顺便说一句,如果您要将用户留在登录页面上,那么最好在该表单上禁用csrf,因为当用户再次登录时,它将大部分超时。                                    

                           
deladels                                
1级                                    
deladels2年前                                    

@Snapey是的,我确实有标准的Auth :: route()。我也有一个退出路线。                                    

谢谢你的小费。                                    

                           
Snapey                                
等级50                                    
Snapey2年前                                        

所以你试图在注销路线上做一个获取请求,但是为后期路线设置了Auth :: routes()                                    

                           
Tm值                                
1级                                    
T!m一年前                                    

如果您在本地进行更改并且在主机中推送更改,则在VENDOR文件夹上本地更新的任何文件都不会在主机上更新。您需要在cpanel中手动在VENDOR文件夹中找到该文件并进行更改。希望这可以帮助                                    

                           
Snapey                                
等级50                                    
Snapey一年前                                        

@T!m                                    

切勿更改供应商文件夹的内容。                                    

切勿建议其他人更改供应商文件夹的内容。                                    

Alagoro                                
1级                                    
Alagoro一个月前                                    

如果覆盖AuthController中的loggedOut方法,则可以完全保留未触及的VENDOR:                                    

protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}
                                   

我甚至用了一个config / logout.php文件                                    

return [
  redirectTo=>'https://myredirectpath',
];
                                   

然后                                    

protected function loggedOut(Request $request) {
    return redirect(config('logout.redirectTo'));
}
                                   

希望能帮助到你。                                    

(迟到总比不到好)                                    

来自 https://laracasts.com/discuss/channels/laravel/laravel-55-redirect-after-logout