0

Laravel 5 Web サイトの管理パネルへのアクセスを許可する前に、ユーザーの ACL チェックを行う必要があります。名前空間内のコントローラ グループ全体に対してこれを行う最善の方法は何App\Http\Controllers\Admin\*ですか? 最終的に、私はこれを行うための「設定して忘れる」方法を探しています。これまでのところ、ミドルウェアが最良の選択肢のようです。

最初のアイデアは、ミドルウェアを管理ルートに割り当てることでしたが、これは他の非管理ルートがコントローラーにアクセスすることを妨げません。これは、ルートが引き続き管理コントローラをターゲットにして、ACL チェックをバイパスできることを意味します。

次のアイデアは、コントローラーのコンストラクターに割り当てを挿入することでしたが、これには追加のコントローラーごとにミドルウェアを明示的に含める必要があります。これにより、開発者はミドルウェアを含める必要があることを知る必要があり、ミドルウェアを完全に見逃す可能性があります。これは、1 つのベース コントローラーをすべての管理コントローラーの親として使用する場合にも当てはまります。これは、開発者がベース コントローラーを拡張する必要があることを知る必要があるためです。今のところ、これが最善の解決策のようです。

これにより、質問に戻ります。ミドルウェアをコントローラーのワイルドカード名前空間に割り当てることはできますApp\Http\Controllers\Admin\*か? または、ACL チェックをすべての管理コントローラーに明示的に割り当てる必要がないようにするためのより良い方法はありますか?

4

2 に答える 2

3

ここで、App\Http\Controllers\Admin* のようなコントローラのワイルドカード名前空間にミドルウェアを割り当てることができるかという疑問に戻ります。

いいえ

最も簡単な方法は、 などのベース コントローラーを作成しApp\Http\Controllers\Admin\Controller、ミドルウェアを含め、他のすべてのコントローラーをApp\Http\Controllers\Admin\*拡張することです。

または、まだ追加している間にApp\Http\Controllers\Admin\Controller、IoC コンテナーを介してミドルウェアを挿入することもできます。

App::afterResolving('App\Http\Controllers\Admin\Controller', function ($controller) {
    $controller->middleware('acl');
});
于 2015-02-26T07:12:31.647 に答える
1

編集

私の以前の回答は、すべての状況でうまく機能しませんでした。それは他の多くのルートを壊しました。これが私が代わりにやったことです(でapp/Http/routes.php):

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'App\Http\Middleware\Acl'], function()
{
  Route::get('/', 'AdminController@index');
  Route::get('/user', 'User\UserController@index');
  ...
});

これは、ルートを定義するときに、少なくともすべての管理コントローラーを対象としています。それは私が望んでいたすべてではありませんが、それは実現します。

于 2015-03-21T18:01:26.893 に答える