首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 4和Sentry 2 ACL结构和访问控制级别

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

Stack Overflow用户
提问于 2014-04-01 09:14:01
回答 2查看 2.4K关注 0票数 0

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

对于角色HR,我有以下权限:

代码语言:javascript
运行
复制
Staffs|View staff details
Staffs|Register new staff
Staffs|Edit staff details
Staffs|Delete staff details

对应于下列路线:

代码语言:javascript
运行
复制
//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. 如果禁用了所有员工权限,请禁用链接.我就是这样做的: 如果($user->hasAnyAccess(数组(‘Staffs\查看员工详细信息’)、‘Staffs\x注册新员工’、‘Staffs Edit staff details’、‘Staffs new Staffs’){ //display菜单链接}
  2. “我的路由”:如果禁用了所有员工权限,则禁用“staff /”项下的所有路由。 //为此,我不知道如何根据我的权限限制路由//但我不想像在控制器(1)中那样做
  3. 禁用与禁用权限相关的操作按钮 //与no (1)相同
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-02 16:45:38

您可以这样做:

在app/filters.php中,创建一个过滤器,如下所示。

代码语言:javascript
运行
复制
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);
    }
});

你可以通过在你的路线上放置一个前置过滤器来应用过滤器。

代码语言:javascript
运行
复制
Route::group(array('before' => 'permissions'), function()
{
    // routes
}

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

代码语言:javascript
运行
复制
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权限,他将能够使用每个产品路由。

现在,对于您希望显示到特定组的链接的部分,您可以使用这样的助手来实现这一点:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-06-02 21:51:17

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22781471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档