限制对非管理员用户的路由访问

时间:2015-06-04 12:26:25

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

目标

我尝试为登录用户创建管理员路由限制。 我已经尝试检查我的用户是否为log-in,以及用户类型是否为Admin,如果是,我希望允许他们访问管理路由,否则,回复404。

routes.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错误 - 即使对于管理员用户也是如此。

2 个答案:

答案 0 :(得分:14)

您可以使用Middleware来解决这个简单的问题。

  1. 创建中间件:
  2. 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
    2. protected $routeMiddleware = [
          'admin' => 'App\Http\Middleware\AdminMiddleware',
      ];
      
      1. 在路线中使用中间件:
      2. Route::group(['middleware' => ['auth', 'admin']], function() {
            // your routes
        });
        

答案 1 :(得分:1)

这个答案是关于为什么您的代码没有按预期工作。 @limonte的解决方案是正确的,我能想到的最好。

解析您的路由文件以获取您的路由,之后,这些路由可能会缓存在其他位置。

因此,您不应该放置任何依赖于请求的代码(例如,检查用户是否具有访问路由的足够权限)。

特别是,您不应该在routes.php中使用以下请求相关模块(不详尽):

  • Auth
  • DB或任何可能依赖于时间的数据库查询
  • Session
  • Request

您应该将您的routes.php视为配置的一部分,它恰好是直接用PHP编写的,而不是您必须学习的一些新语言。