0

我正在使用 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)
    
4

2 回答 2

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

于 2014-04-02T16:45:38.017 回答
1

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

于 2014-06-02T21:51:17.590 回答