首页 文章

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

提问于
浏览
3

我正在使用Laravel 5.3并尝试实现身份验证系统 . 我用 php artisan 命令 make:auth 来设置它 . 我根据我的布局编辑了视图,并将其重定向到我的仪表板页面而不是主页(在设置中设置为默认值) . 现在,当我尝试注销时,它会把这个错误抛给我

NotFoundHttpException in RouteCollection.php line 161

我在routes / web.php中的代码是:

Auth::routes();

Route::get('/pages/superadmin/dashboard', 'HomeController@index');

HomeController.php

<?php

 namespace App\Http\Controllers;

 use Illuminate\Http\Request;

 class HomeController extends Controller
 {
/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('auth');
}

/**
 * Show the application dashboard.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    return view('dashboard');
}
}

Auth/Login Controller.php

<?php

namespace App\Http\Controllers\Auth;

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

class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/

use AuthenticatesUsers;

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = '/dashboard';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}
}

我尝试了此页面上的解决方案:How to set laravel 5.3 logout redirect path?但它无效并显示以下错误:

ReflectionException in Route.php line 339:
 Class App\Http\Controllers\Auth\Request does not exist

我想将其重定向到auth /文件夹中的登录页面 .

6 回答

  • 0

    我终于在LoginController.php中添加了这一行来解决这个问题

    protected $redirectAfterLogout = 'auth/login';
    

    并编辑此文件\ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Auth \ AuthenticatesUsers.php如果您未在此文件中提供$ redirectAfterLogout,它将使用默认的'/' . 你也可以在github上找到它 . 链接就在答案的最后 .

    public function logout()
     {
      return redirect(property_exists($this, 'redirectAfterLogout') ? $this- >redirectAfterLogout : '/');
    }
    

    你也可以在这里查看:https://github.com/laravel/framework/commit/aa1204448a0d89e2846cbc383ce487df6efd9fc8#diff-b72935cc9bfd1d3e8139fd163ae00bf5

    希望它可以帮助某人 .

    谢谢

  • 2

    如果您想继续使用GET注销

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

    要么

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

    在Laravel 5.4中测试过

    我认为最好的解决方案是覆盖从 app/Http/Controllers/Auth/LoginController.php 文件内部调用的继承的"logout"方法 . 通过向此类添加以下方法来执行此操作:

    /**
     * Log the user out of the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function logout(Request $request)
    {
        $this->guard()->logout();
    
        $request->session()->flush();
    
        $request->session()->regenerate();
    
        return redirect('/login');
    }
    

    由于"LoginController"类继承自 Illuminate\Foundation\Auth\AuthenticatesUsers ,您应该能够安全地覆盖此方法(在LoginController中)而不编辑实际的供应商文件本身...如果您编辑 AuthenticatesUsers 文件或任何供应商文件将导致严重的问题曾想升级......

    这里唯一的额外步骤是您需要在 LoginController 类的顶部包含以下行:

    use Illuminate\Http\Request;
    
  • 2

    在Laravel 5.3中 logouthttp post 而不是 http get . 您可以通过发布请求注销,例如Taylor Otwell do auth scaffolding .

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

    将注销操作重定向到登录页面意味着除非用户通过身份验证,否则站点中没有页面可用 .

    我不是上面提到的触及 vendor 目录的忠实粉丝 . 确实如此,Laravel 5.4 vendor/laravel/framework/src/Illuminate/Foundation/Auth/AutenticateUser->logout() 重定向到 '/' . 没有可用于更改它的参数 . 所以让's keep it that way and just add an ' auth保护' to the route ' /'(家)

    /routes/web.php 添加 Route::get('/', function () { return view('home'); })->middleware('auth');

    这不是最简单的方法吗?

  • 2

    适用于laravel 5.6
    File => app/Http/Controllers/Auth/LoginController.php

    use Illuminate\Http\Request;
    
    class LoginController extends Controller
    {
        ...  ...  ...
        ...  ...  ...
        ...  ...  ...
    
        /**
         * Log the user out of the application.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
    
        public function logout(Request $request)
        {
             $this->guard()->logout();
             $request->session()->flush();
             $request->session()->regenerate();
             return redirect('/login');
        }
    }
    

    谢谢The Virtual Machinist为您的answer .

相关问题