如何在ACL中设置lavelvel 4资源路由的特定方法

时间:2014-01-25 01:51:19

标签: php laravel laravel-4 acl

我有一个相当简单的ACL系统设置。过滤器检查用户是否是可以访问路由的用户组的一部分,或者用户是否有权访问该路由。它适用于各个路线,适用于一般资源。但是,我希望一些用户可以访问资源路由的特定方法,但不是所有用户都可以访问。例如,user1是admin组的一部分,并且始终可以访问admin资源路由,但user2不是admin用户组的一部分,我想让他访问teh资源admin / create。如何使用我的设置在Laravel 4中进行此操作

数据库

 Routes:
      id
      route
      created_by
      last_editted_by
      created
      updated
      deleted_at

acl (table it looks at to see if user has access)
      id
      routes_id
      user_id
      group_id
      created
      updated
      deleted_at

Filter
if (Auth::check()){
    $route = Request::segment(1);

    $user_id = Auth::user()->id;

    $acl_count = Acls::join('routes','routes.id','=','acl.routes_id')
                ->where('routes.route','=',$route)
                ->Where(function($in_parenthesis) use($user_id){
                    $in_parenthesis->whereIn('acl.group_id',function($where_in) use($user_id){
                            $where_in->select('group_id')
                                ->from('user_group_junction')
                                ->where('user_id','=',$user_id);
                            })
                    ->orWhere('acl.user_id','=',$user_id);
                })
                ->count();

    if($acl_count < 1){
        return Redirect::to('/');
    }
}else{
    return Redirect::to('/');
}

Routes
Route::get('/','HomeController@index');

Route::get('login','AuthorizationController@loginForm');
Route::post('authenticate','HomeController@authenticate');
Route::get('logout','HomeController@logout');

Route::group(array('before'=>'auth'),function(){
Route::group(array('before'=>'user_permission'),function(){
    Route::get('protected','HomeController@protectedPage');
    Route::resource('sources', 'SourcesController');
    Route::resource('admins', 'AdminsController');
});
});

2 个答案:

答案 0 :(得分:2)

您可以在beforeFilter的{​​{1}}方法中使用__construct,如下所示(仅为管理员控制器创建不同的方法)

AdminBaseController

此外,您可以在class AdminController extends AdminBaseController { function __construct() { // Use filter on all methods but not on create $this->beforeFilter('admin', array('except' => array('create'))); } } 控制器中直接使用此beforeFilter并使用resource,也可以使用except(仅限反向工作,但允许访问所有人)但过滤器只提到了数组中的方法)。您还可以检查构造函数方法中的条件。

答案 1 :(得分:1)

我发现我的部分问题在于过滤器。如果我的路线(无论是资源还是仅包含“/”的路线)都无效,我只会查看网址的第一段无法正常工作。因此我问了另一个问题here