Laravel 基于值而非动词的授权

Laravel 基于值而非动词的授权,laravel,laravel-4,Laravel,Laravel 4,我正在实施一个基于价值观而非动词的授权流程 例如: 允许所有用户/组更新数据库字段 管理员可以将状态设置为所有可能的值(已确认|挂起|取消) 供应商可以设置为“已确认” 我发现的所有例子都围绕着一个用户/组是否能够插入、更新或删除某些内容 是否有一些东西可以处理这种开箱即用的情况,或者是硬编码的情况?基本上,您需要的是在任何应用程序中都很难维护的东西:细粒度权限 你可以使用Cartalyst的哨兵轻松完成这项任务。我是这样做的: 我的所有路线都是按层次组织的,并按如下方式命名: <?p

我正在实施一个基于价值观而非动词的授权流程

例如:

  • 允许所有用户/组更新数据库字段
  • 管理员可以将状态设置为所有可能的值(已确认|挂起|取消)
  • 供应商可以设置为“已确认”
我发现的所有例子都围绕着一个用户/组是否能够插入、更新或删除某些内容


是否有一些东西可以处理这种开箱即用的情况,或者是硬编码的情况?

基本上,您需要的是在任何应用程序中都很难维护的东西:细粒度权限

你可以使用Cartalyst的哨兵轻松完成这项任务。我是这样做的:

我的所有路线都是按层次组织的,并按如下方式命名:

<?php

Route::get('login',      array('as'=>'logon.login',     'uses'=>'LogonController@login'));
Route::get('logged/out', array('as'=>'logon.loggedOut', 'uses'=>'LogonController@loggedOut'));

Route::group(array('before' => 'auth'), function()
{
    Route::get('logout',     array('as'=>'logon.logout',    'uses'=>'LogonController@logout'));

    Route::group(array('before' => 'permissions'), function()
    {
        Route::get('store/checkout/shipping/address',   array('as'=>'store.checkout.shipping.address',  'uses'=>'StoreController@shippingAddress'));
        Route::get('store/checkout/payment/confirmed',  array('as'=>'store.checkout.payment.confirmed', 'uses'=>'StoreController@confirmed'));
        Route::get('profile',                           array('as'=>'profile.show',                     'uses'=>'ProfileController@show'));
    });
});
基本上,这里我得到了当前的路由名称,添加了'system',并检查用户是否有这个特殊的权限

以下是我如何创建组和填充权限:

<?php

public function seedPermissions()
{
    DB::table('groups')->truncate();

    $id = 1;

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

    Sentry::getGroupProvider()->create(array(
        'id' => $id++,
        '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,
        ),
    ));

    Sentry::getGroupProvider()->create(array(
        'id' => $id++,
        'name'        => 'Users',
        'permissions' => array(
            'system.store.checkout' => 1,
            'system.profile' => 1,
        ),
    ));
}
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
system.store
system.store.checkout
system.store.checkout.payment
system.store.checkout.payment.confirmed
如果Sentry在用户粒度权限中找到其中一个,它将返回true

现在我只需将用户添加到组:

Sentry::findUserById(1)->addGroup( Sentry::getGroupProvider()->findByName('Users') );
如果我需要对特定用户/权限进行细化,我只需要:

$user = Sentry::findUserById(1);
$user->permissions['store.checkout.payment'] = false;
$user->save();

用户再也无法在商店中购买任何东西了。:)

谢谢安东尼奥。需要时间来消化这些信息。我们将深入研究这个新术语,粒度权限。
$user = Sentry::findUserById(1);
$user->permissions['store.checkout.payment'] = false;
$user->save();