将Auth中间件应用于所有Laravel路由

时间:2019-01-15 12:06:00

标签: laravel laravel-5 laravel-routing laravel-middleware

当我在所有控制器中应用身份验证中间件时,对除登录和注册之外的所有路由进行身份验证的正确方法是什么?有没有一种方法可以在一个地方应用身份验证中间件并排除登录,注册路由?

3 个答案:

答案 0 :(得分:1)

您可以在routes.php文件中应用中间件,您需要做的是将所有路由放在一个组中,并添加中间件“ auth”(已配置的Auth :: routes()除外) ,例如:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });

    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});

更多信息可以在文档中找到:https://laravel.com/docs/5.7/routing#route-group-middleware

答案 1 :(得分:0)

您可以对所有经过身份验证的路由进行分组,如下所示,laravel为auth和guest用户提供了默认的中间件

Route::group(['middleware' => ['auth']], function () { 
    Route::get('home', 'HomeController@index');
    Route::post('save-user', 'UserController@saveUser');
    Route::put('edit-user', 'UserController@editUser');
});

以上路由名称只是组成,请为您的路由和控制器遵循正确的命名约定。另请参阅有关here上的中间件和here上的路由

答案 2 :(得分:0)

您可以通过将中间件添加到web.php中的路由映射中来将中间件添加到整个RouteServiceProvider路由文件中。

转到app/Providers/RouteServiceProvider.php,然后在mapWebRoutes()中,将middleware('web')更改为middleware(['web', 'auth'])

protected function mapWebRoutes()
{
    Route::middleware(['web', 'auth'])
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

创建一个新方法mapAuthRoutes()

protected function mapAuthRoutes()
{
    Route::middleware('web')
        ->namespace('App\Http\Controllers\Auth')
        ->group(base_path('routes/auth.php'));
}

映射它:

public function map()
{
    $this->mapAuthRoutes(); // <-- add this
    $this->mapWebRoutes();
    ...
}

auth.php文件夹中创建一个routes文件,然后粘贴以下内容(并删除不需要的内容):

<?php

use Illuminate\Support\Facades\Route;

Route::get('login', 'LoginController@showLoginForm')->name('login');

Route::post('login', 'LoginController@login')->name('login');

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


Route::get('register', 'RegisterController@showRegistrationForm')->name('register');

Route::post('register', 'RegisterController@register')->name('register');


Route::get('password/reset', 'ForgotPasswordController@showLinkRequestForm')->name('password.request');

Route::post('password/email', 'ForgotPasswordController@sendResetLinkEmail')->name('password.email');

Route::get('password/reset/{token}', 'ResetPasswordController@showResetForm')->name('password.reset');

Route::post('password/reset', 'ResetPasswordController@reset')->name('password.update');


Route::get('email/verify', 'VerificationController@show')->name('verification.notice');

Route::get('email/verify/{id}', 'VerificationController@verify')->name('verification.verify');

Route::get('email/resend', 'VerificationController@resend')->name('verification.resend');

现在您可以在1个地方配置所有内容,例如prefixnamemiddlewarenamespace

选中php artisan route:list以查看结果:)