berpcor / rbac
Requires
- php: >=5.3.0
- illuminate/support: 4.1.*
This package is not auto-updated.
Last update: 2024-09-28 15:44:30 UTC
README
在安装 RBAC 之前,需要实现授权/注册系统(使用 Laravel)并存在 Users 表(该软件包使用 User 模型)。
- 通过 composer 安装 package
"berpcor/rbac": "dev-master"
- 运行迁移。
php artisan migrate --package="berpcor/rbac"
- 在 config/app.php 中添加服务提供者
'Berpcor\RBAC\RBACServiceProvider',
- 在 User 模型中添加
public function role() { return $this->belongsTo('Role'); }
- 在过滤器中添加
Route::filter('rbac', function() { if(!RBAC::filterMethod()){ if (Request::ajax()) { $data = array('error'=>'Пользователь не имеет разрешения на доступ.'); return Response::json($data); }else { // Или другое требуемое действие в случае, если пользователь не имеет разрешения (редирект, 404, ...) App::abort(404); } } });
工作原理
存在一系列受保护的操作(以下称为权限)。它们存储在 Permissions 表中。这些权限分组为角色。而角色分配给用户。即如果用户的角色分配了特定的权限,则这意味着用户可以执行这些操作。那些存在于 Permissions 表中但未分配给用户角色的权限,用户不能执行。
创建用户时,使用与安装 rbac 之前相同的方式,默认分配给用户默认角色。默认角色禁止任何受保护的操作。它不能被编辑和删除。
用户可以自由创建和删除。角色独立于用户存在。
访问控制是在控制器动作级别实现的。它们存储在 Permissions 表的 'action' 字段中,形式为 ControllerName@action。保存的动作用于路由。如果路由如下
Route::get('/test', array( "as" => "route_name", 'before' => 'rbac', "uses" => "ControllerName@test" ));
则动作 - ControllerName@test。为了使用户访问控制正常工作,需要使用具有控制器和 'uses' 的路由。对于此类路由,控制将无法工作
Route::get('/test','ControllerName@action');
然后创建一个角色。在创建后,新角色没有任何权限,与默认角色不同的是名称和可以添加权限。即如果用户在创建后立即分配创建的角色,则他不能执行任何受保护的操作。为了使用户能够执行受保护的操作,需要将权限添加到用户的角色中。
如果权限被分配给了至少一个角色,则不能删除权限。首先需要从所有角色中解绑此权限。角色在分配给至少一个用户之前不能被删除。为了删除角色,需要从所有用户中解绑该角色。
角色访问控制系统用于用户 - 这是显而易见的。因此,只有对于授权用户才有意义使用访问控制。为了使角色访问控制系统开始工作,需要将需要授权的路由组合成一组,并将第一个过滤器指定为 auth,然后是 rbac。检查用户是否有权访问当前路由将自动进行。什么都不需要特别做。一切都会自动运行。如果用于访问当前路由的是ajax,则将返回包含数据的数组
$data = array('error'=>'Пользователь не имеет разрешения на доступ.'); return Response::json($data);
因此,可以使用 rbac 来处理 ajax。
方法描述
/** * Создать роль с именем и ее описанием. Имя роли уникально. При попытке создания роли с дублирующимся именем, выводится * ошибка. Имя роли вводится на русском. Это имя, вместе с описанием, нужно выводить в админ. разделе сайта. */ RBAC::createRole($name, $description); /** * Удалить роль. Удаление возможно только если роль не назначена ни одному пользователю. */ RBAC::deleteRole($id); /** * Создание защищенного действия - пермишена. Имя и описание - для человека. Action - для компьютера. * Action берется из 'uses' маршрута. */ RBAC::createPermission($name, $description, $action); /** * Удаление защищенного действия. Возможно только если оно не назначено ни одной роли. */ RBAC::deletePermission($id); /** * Назначание роли пользователю. Если пользователю уже была назначена какая-то роль, то происходит ее переназначение. */ RBAC::assignRoleToUser($user_id,$role_id); /** * Абсолютно одинаковые методы, но с разными названиями. Удаляют пользователю текущую назначенную роль. И устанавливают * ему роль default. У пользователя не может совсем не быть роли. Если у пользователя уже итак имеется роль default, * то выводится ошибка. */ RBAC::removeUsersRole($user_id); RBAC::setDefaultRoleFor($user_id); /** * Роли присваиваются пермишены. в $permission_id должен передаваться массив с id пермишенов. При каждом новом * назначении пермишенов старые перезаписываются. Если нужно отвязать все пермишены от роли, то нужно передать пустой * массив id пермишенов. */ RBAC::attachPermissionToRole($role_id, $permission_id); /** * Используется для формирования шаблонов. Если требуется выводить или не вывозить что-то в зависимости от того, * разрашено ли пользователю получать доступ к экшену или нет. Испольуется так: * if(RBAC::hasPermission('Controller@action')){// разрешено}. * В $action передается экшен из uses маршрута. */ RBAC::hasPermission($action)
除 hasPermission 外的所有方法都可能返回错误,因此需要用 try/catch 块包装
try { RBAC::someMethod(); } catch (Exception $e) { // Или любое другое действие if (Request::ajax()) { $data = array('error'=>$e->getMessage()); return Response::json($data); }else { // Или другое требуемое действие в случае, если пользователь не имеет разрешения (редирект, 404, ...) return 'пользователь не имеет разрешения'; return $e->getMessage(); } }
如上所述,对于模板,需要使用 RBAC::hasPermission('action')。如果用户有权访问,则返回 true,如果没有,则返回 false。
RBAC 适用于 RESTful 控制器。
需要的 resource 控制器隐藏在授权之后(可以添加到包含所有其他组的组中)。或者,如果它不在组中,可以在控制器本身的 __construct 中设置过滤器。首先 auth,然后是 rbac。
标准角色。
超级用户和标准用户。标准角色 - 所有受保护的操作都被禁止。管理员 - 所有受保护的操作都被允许。不能删除它们,也不能编辑它们的权限。在代码和逻辑中,始终使用数据库表中的 ID 进行绑定。如果 RBAC 扩展设置正确,则在 Roles 表中,标准角色应该是 ID = 1,而管理员是 ID = 2。