我正在使用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');
我需要以下访问控制:
链接为查看人员:如果禁用所有员工权限,请禁用链接。这就是我的做法:
if($user->hasAnyAccess(array('Staffs|View staff details', 'Staffs|Register new staff', 'Staffs|Edit staff details', 'Staffs|Delete staff details')))
{
//display menu link
}
我的路线:如果禁用所有员工权限,请禁用属于"员工/"
的所有路线//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
禁用与禁用权限相关的操作按钮
//same as no (1)
答案 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