【问题标题】:laravel route filter to check user roleslaravel 路由过滤器检查用户角色
【发布时间】:2014-01-14 15:55:55
【问题描述】:

我正在 laravel 4 中构建一个 restful api,其中有具有不同类型权限的用户。我想根据用户角色限制对不同路由的访问(保存在 db 的用户表中)

我该怎么做?这是我到目前为止所拥有的(到目前为止还没有工作)。

filters.php

//allows backend api access depending on the user's role once they are logged in
Route::filter('role', function()
{ 
return Auth::user()->role;
}); 

routes.php

 Route::group(array('before' => 'role'), function($role) {
 if($role==1){
        Route::get('customer/retrieve/{id}', 'CustomerController@retrieve_single');
        Route::post('customer/create', 'CustomerController@create');
        Route::put('customer/update/{id}', 'CustomerController@update');
 }

    });

是否有可能我为“组过滤器”编写了错误的语法?

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    从 laravel 5.1.11 开始,您可以使用 AuthServiceProvider:https://laravel.com/docs/5.1/authorization

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      filters.php

      Route::filter('role', function()
      { 
        if ( Auth::user()->role !==1) {
           // do something
           return Redirect::to('/'); 
         }
      }); 
      

      routes.php

       Route::group(array('before' => 'role'), function() {
              Route::get('customer/retrieve/{id}', 'CustomerController@retrieve_single');
              Route::post('customer/create', 'CustomerController@create');
              Route::put('customer/update/{id}', 'CustomerController@update');
      
      
      });
      

      【讨论】:

      • 完全正确...应该可以...但是如果您需要为多个角色执行此操作,我们需要更改过滤器路由,例如Route::filter('role', function() { $roles = ['2','3','4']; if (!in_array(Auth::user()->role, $roles)) { return Redirect:to('/'); } });
      【解决方案3】:

      您可以通过不同的方式实现这一点,因为路由过滤器接受参数:

      Route::filter('role', function($route, $request, $value)
      {
        //
      });
      
      Route::get('someurl', array('before' => 'role:admin', function()
      {
        //
      }));
      

      以上将在您的 Route::filter 中注入 admin,可通过 $value 参数访问。 如果您需要更复杂的过滤,您始终可以使用自定义路由过滤器类(检查过滤器类): http://laravel.com/docs/routing#route-filters

      您还可以在控制器中进行过滤,当您需要基于特定控制器和方法进行过滤时,这提供了一种更好的方法: http://laravel.com/docs/controllers#controller-filters

      最后,您可以使用 Sentry2 之类的东西,它提供了一个完整的 RBAC 解决方案,可在您的项目中使用: https://cartalyst.com/manual/sentry

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-15
        • 2016-05-15
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多