Laravel 4和Sentry 2 ACL结构和访问控制级别

时间:2014-04-01 09:14:02

标签: laravel-4 cartalyst-sentry

我正在使用laravel 4开发一个站点,并尝试使用Sentry 2实现我的ACL。我需要有关如何构建以下内容的帮助:

我对角色HR拥有以下权限:

Staffs|View staff details
Staffs|Register new staff
Staffs|Edit staff details
Staffs|Delete staff details

对应以下路线:

//get route to staffs landing page
Route::get('staffs/view-staffs', 'UsersController@getManageStaffs'); 

//post routes
Route::post('staffs/add-staff', 'UsersController@postAddStaff');
Route::post('staffs/update-staff', 'UsersController@postUpdateStaff');
Route::post('staffs/delete-staff', 'UsersController@postDeleteStaff');

我需要以下访问控制:

    我的菜单上的
  1. 链接为查看人员:如果禁用所有员工权限,请禁用链接。这就是我的做法:

    if($user->hasAnyAccess(array('Staffs|View staff details', 'Staffs|Register new staff', 'Staffs|Edit staff details', 'Staffs|Delete staff details')))
    {
        //display menu link
    }
    
  2. 我的路线:如果禁用所有员工权限,请禁用属于"员工/"

    的所有路线
    //For this, i have no idea how to restrict routes based on my permissions
    //But i don't want to do it like i did in (1) within my controllers
    
  3. 禁用与禁用权限相关的操作按钮

    //same as no (1)
    

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

在app / filters.php中,按如下方式创建过滤器。

Route::filter('permissions', function()
{
    $name = Route::current()->getName();
    $name =  'system' . ( ! empty($name) ? '.' : '') . $name;

    if (!UserHelper::hasPermission($name)) {
        App::abort(401, 'You are not authorized to access route '.$name);
    }
});

您可以通过在路线上放置一个前置过滤器来应用过滤器,例如

Route::group(array('before' => 'permissions'), function()
{
    // routes
}

使用此系统,您可以创建以下权限组:

Sentry::getGroupProvider()->create(array(
    'id' => 1,
    'name'        => 'Super Administrators',
    'permissions' => array(
        'system' => 1,
    ),
));

Sentry::getGroupProvider()->create(array(
    'id' => 2,
    'name'        => 'Administrators',
    'permissions' => array(
        'system.users' => 1,
        'system.products' => 1,
        'system.store' => 1,
        'system.profile' => 1,
    ),
));
Sentry::getGroupProvider()->create(array(
    'id' => $id++,
    'name'        => 'Managers',
    'permissions' => array(
        'system.products' => 1,
        'system.store' => 1,
        'system.profile' => 1,
    ),
));

因此,如果用户拥有system.products权限,他就可以使用所有产品路线。

现在,对于您希望显示某些群组链接的部分,您可以使用以下帮助程序执行此操作:

public static function has($permission)
{
    $all = [];
    $parts = explode('.',$permission);
    $permission = '';

    foreach($parts as $part) {
        $permission .= (!empty($permission) ? '.' : '') . $part;
        $all[] = $permission;
    }

    return Sentry::check() and Sentry::getUser()->hasAnyAccess($all);
}

您只需将路线名称(例如system.products)传递给该功能,并且它将返回用户是否有权访问该功能。 资料来源:https://laracasts.com/forum/conversation/post/2819

答案 1 :(得分:1)

fortry ACL有一个很酷的包,它实现了一个功能齐全的管理面板https://github.com/intrip/laravel-authentication-acl