berpcor / rbac2
Requires
- php: >=5.3.0
- illuminate/support: 4.2.*
This package is not auto-updated.
Last update: 2024-09-24 09:56:54 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。