9

ゴール

ログイン ユーザーに対して管理者ルート制限を作成しようとしています。log-inユーザーがであるかどうか、またユーザー タイプがであるかどうかを確認するためのチェックを試みましたAdmin。そうであれば、管理ルートへのアクセスを許可し、それ以外の場合は 404 を応答します。


ルート.php

<!-- Route group -->
$router->group(['middleware' => 'auth'], function() {

    
    <!-- No Restriction -->
    Route::get('dashboard','WelcomeController@index');
   
    <!-- Admin Only -->
    if(Auth::check()){
        if ( Auth::user()->type == "Admin" ){

            //Report
            Route::get('report','ReportController@index');
            Route::get('report/create', array('as'=>'report.create', 'uses'=>'ReportController@create'));
            Route::post('report/store','ReportController@store');
            Route::get('report/{id}', array('before' =>'profile', 'uses'=>'ReportController@show'));
            Route::get('report/{id}/edit', 'ReportController@edit');
            Route::put('report/{id}/update', array('as'=>'report.update', 'uses'=>'ReportController@update'));
            Route::delete('report/{id}/destroy',array('as'=>'report.destroy', 'uses'=>'ReportController@destroy'));

        }
    }

});

結果

意図したとおりに機能していません。管理者ユーザーであっても、404 エラーがスローされます。

4

2 に答える 2

27

この単純なケースにはミドルウェアを使用できます。

  1. ミドルウェアを作成します。
php artisan make:middleware AdminMiddleware
namespace App\Http\Middleware;

use App\Article;
use Closure;
use Illuminate\Contracts\Auth\Guard;

class AdminMiddleware
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->getUser()->type !== "admin") {
            abort(403, 'Unauthorized action.');
        }

        return $next($request);
    }
}
  1. に追加しapp\Http\Kernel.phpます:
protected $routeMiddleware = [
    'admin' => 'App\Http\Middleware\AdminMiddleware',
];
  1. ルートでミドルウェアを使用します。
Route::group(['middleware' => ['auth', 'admin']], function() {
    // your routes
});
于 2015-06-04T12:30:59.717 に答える
1

この回答は、コードが期待どおりに機能しない理由に関するものです。@limonte の解決策は正しく、私が考えることができる最高のものです。

ルート ファイルが解析されてルートが取得されます。その後、それらのルートは別の場所にキャッシュされる可能性があります。

したがって、リクエストに依存するコードを配置しないでください (たとえば、ユーザーがルートにアクセスするのに十分な権限を持っているかどうかを確認するなど)。

特に、routes.php 内で次のリクエスト依存モジュールを使用しないでください (網羅的ではありません)。

  • Auth
  • DBまたは時間に依存する可能性のあるあらゆる種類のデータベースクエリ
  • Session
  • Request

routes.php を構成の一部として表示する必要があります。たまたま、学習しなければならない新しい言語ではなく、php で直接記述されているだけです。

于 2015-06-04T13:12:52.133 に答える