berpcor/rbac2

此包的最新版本(dev-master)没有可用的许可信息。

dev-master 2014-08-20 15:44 UTC

This package is not auto-updated.

Last update: 2024-09-24 09:56:54 UTC


README

在安装 RBAC 之前,必须实现授权/注册系统(使用 Laravel)并且存在 Users 表(包使用 User 模型)。

  1. 通过 composer 安装 package
"berpcor/rbac": "dev-master"
  1. 运行迁移。
  php artisan migrate --package="berpcor/rbac"
  1. 在 config/app.php 中添加服务提供者
  'Berpcor\RBAC\RBACServiceProvider',
  1. 在 User 模型中添加
  public function role()
  {
      return $this->belongsTo('Role');
  }
  1. 在过滤器中添加
  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。