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();