【问题标题】:Apply Auth Middleware to All Laravel Routes将 Auth 中间件应用于所有 Laravel 路由
【发布时间】:2019-06-09 10:37:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以对所有经过身份验证的路由进行分组,如下所示,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】:

      您可以在 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

      【讨论】:

        【解决方案3】:

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

        转到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();
            ...
        }
        

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

        <?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 以查看结果:)

        【讨论】:

        • 真正的问题 - 为什么我们需要添加 mapAuthRoutes()?请照亮。
        • @quinny 你不用创建新函数mapAuthRoutes,如果你愿意,可以把路由组加入mapWebRoutes函数吗?只要它被映射,你想怎么做就取决于你了。如果没有映射,它不会出现在artisan route:list 上并且不会工作。对我来说,这种添加方法更清洁吗? :)
        猜你喜欢
        • 2017-07-04
        • 2019-10-05
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 2018-09-22
        • 2016-05-14
        • 1970-01-01
        • 2021-11-23
        相关资源
        最近更新 更多