【问题标题】:Protecting some routes with auth middleware but leaving others unprotected使用 auth 中间件保护某些路由,但让其他路由不受保护
【发布时间】:2017-11-15 19:13:27
【问题描述】:

我有一个受保护的路由组:

Route::group(['prefix' => 'member', 'middleware' => 'auth'], function () {
    Route::get('/')->name('member.home')->uses('MemberController@index');
    Route::get('show')->name('member.show')->uses('MemberController@show');
    // ...various additional protected member routes...
});

但是,我有两条路线不应该受到保护:

Route::get('member/pay')->name('member.pay')->uses('MemberController@pay');
Route::get('member/confirm/{payment}')->name('member.confirm')->uses('MemberController@confirm');

只要'middleware' => 'auth' 应用于该单独的路由组,所有member 前缀路由都会被它覆盖,即使我没有将它们放在组中。

我已经尝试在受保护路由组的上方和下方移动不受保护的路由,但我仍然得到401 unauthorized,除非我完全删除中间件。

这不会影响我的任何其他路线...仅以 member 为前缀的路线。

如何从身份验证中排除这两条路由?

【问题讨论】:

    标签: laravel laravel-5.4


    【解决方案1】:

    一种方法是从 Route 组中删除中间件分配,而是在 MemberController 构造函数中分配中间件。这样您就可以排除哪些方法不应该应用它,如下所示:

    class MemberController extends Controller
    {
        /**
         * Instantiate a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('auth')->except(['pay', 'confirm']);
        }
    }
    

    【讨论】:

    • 看到这个后我刚刚检查了构造函数,并注意到$this->middleware('auth'); 行在MemberController 中,这解释了为什么所有成员路由都受到保护。删除它可以解决问题。
    【解决方案2】:

    像这样使用嵌套组。

    Route::group([ 'prefix' => 'member' ], function() {
        // Protected routes
        Route::group([ 'middleware' => 'auth' ], function() {
            Route::get('/', 'MemberController@index')->name('member.home');
            Route::get('show', 'MemberController@show')->name('member.show');
            // ...various additional protected member routes...
        });
    
        // Non protected routes
        Route::get('pay', 'MemberController@pay')->name('member.pay');
        Route::get('confirm/{payment}', 'MemberController@confirm')->name('member.confirm');
        // ...various additional non protected member routes...
    });
    

    【讨论】:

      【解决方案3】:

      怎么样

      Route::group(['prefix' => 'member'], function () {
          Route::get('/')->name('member.home')->uses('MemberController@index')->middleware('auth');
          Route::get('show')->name('member.show')->uses('MemberController@show')->middleware('auth');
          //
          Route::get('member/pay')->name('member.pay')->uses('MemberController@pay');
          Route::get('member/confirm/{payment}')->name('member.confirm')->uses('MemberController@confirm');
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 2021-04-06
        • 1970-01-01
        相关资源
        最近更新 更多