a2design-inc/laravel4-acl

Laravel 4 的 ACL 组件

v1.0.2 2017-04-25 07:14 UTC

README

Laravel 4 的 ACL 组件。

(截至 v1.0.0-RC6,laravel-acl 已不再与 Laravel 4.0 兼容。对于 Laravel 4.0,请使用版本 v1.0.0-RC5 或更早版本)

Build Status

安装

首先,您需要通过 Composer 安装此包。编辑您的项目 composer.json 文件,以要求 vivify-ideas/acl

  "require": {
    "vivify-ideas/acl": "dev-master"
  },
  "minimum-stability" : "dev"

然后,从终端更新 Composer

  composer update

一旦此操作完成,您需要将服务提供者添加到您的应用程序中。打开 app/config/app.php,并将新项目添加到 providers 数组中。

  'VivifyIdeas\Acl\AclServiceProvider',

还要向别名数组中添加新的别名。

  'Acl' => 'VivifyIdeas\Acl\Facades\Acl',

最后一步是创建用于存储 ACL 的数据库结构。您可以通过运行以下 artisan 命令轻松完成此操作

php artisan acl:install

这将使用当前的权限提供者(Eloquent)来创建必要的数据库结构。完成后,您应该在数据库中有六个新表:acl_permissionsacl_groupsacl_user_permissionsacl_rolesacl_roles_permissionsacl_users_roles

这就完成了!您可以开始使用了。

配置

在运行 artisan acl:install 命令后,您将在 app/config/packages/vivify-ideas/acl/config.php 中获得一个新的配置文件。

在那里,您会注意到几个不同的设置。

提供者

'provider' => 'eloquent'

在这里,您可以设置要使用的提供者类。此 ACL 组件的主要功能是 PermissionsProvider,它抽象了权限的存储。目前,Eloquent 是唯一可用的权限提供者(您可以将权限存储在您在项目中指定的数据库中)。

超级用户

'superusers' => array()

在这里,您可以定义将具有超级用户权限的用户 ID。这些用户将允许所有权限。

访客用户

'guestuser' => 0

在此处放置用于设置访客用户权限的 ID。

权限

'permissions' => array()

在这里,您需要为每个将由 ACL 保护的资源设置权限。任何未在此处定义或其 allowed 字段设置为 true 的资源都将可以由任何经过身份验证的用户或访客自由访问。权限需要以下格式

array(
  array(
    'id' => 'PERMISSION_ID',
    'allowed' => true|false,
    'route' => array('GET:/resource/(\d+)/edit', 'PUT:/resource/(\d+)'),
    'resource_id_required' => true|false,
    'name' => 'Permission name',
    'group_id' => 'GROUP_ID_1', // optional
  ), array(
    'id' => 'PERMISSION_ID_2',
    'allowed' => true|false,
    'route' => 'GET:/resource/(\d+)',
    'resource_id_required' => true|false,
    'name' => 'Permission 2 name'
    'group_id' => 'GROUP_ID_2', // optional
  )
 )

'groups' => array()

组的目的是限制对具有相同基本路径的资源组的访问。例如,您想允许用户访问位于 admin/products 路径的页面。每个权限都可以属于一个组。您可以拥有属于其他组的组。每个组都可以有一个路由。使用以下格式

array(
  array(
    'id' => 'ADMIN_PRIVILEGES',
    'name' => 'Administrator Privileges',
    'route' => 'GET:/admin/(\d+)',

    'children' => array(
      array(
        'id' => 'MANAGE_STUFF',
        'name' => 'Manage Stuff',
        'route' => 'GET:/resource/(\d+)'
      ),
      array(
        'id' => 'MANAGE_PRODUCTS',
        'name' => 'Manage Products',
        'route' => 'GET:/resource/(\d+)'
      ),
      array(
        'id' => 'MANAGE_USERS',
        'name' => 'Manage Users',
        'route' => 'GET:/resource/(\d+)',

        'children' => array(
          array(
            'id' => 'MANAGE_SPEC_USER',
            'name' => 'Manage spec user',
            'route' => 'GET:/resource/(\d+)'
          )
        )
      )
    )
  ),
  array(
    'id' => 'STUFF_PRIVILEGES',
    'name' => 'Stuff Privileges',
  )
)

角色

'roles' => array()

角色是一组可以分配给不同用户的权限。基于角色的权限在一般权限之后、用户特定权限之前应用。这意味着您可以使用用户特定权限覆盖基于角色的权限。

用法

当您对配置文件满意时,运行以下 artisan 命令

php artisan acl:update

此命令需要在您更新配置文件并希望将其添加到数据库中的新权限时运行。

如果您想删除所有权限(包括用户权限),并再次从配置文件重新加载权限,可以使用此命令

php artisan acl:reset

可用的 Artisan 命令

以下是所有 artisan 命令的列表

  • acl:install 创建 ACL 表结构。
  • acl:install clean 删除所有 acl 表,将配置文件重置为默认版本,然后再次创建 ACL 表结构。
  • acl:update 从配置文件更新数据库中的所有 ACL 权限。
  • acl:reset 重置所有ACL权限。这将删除用户和系统权限,并从配置文件安装权限

将ACL过滤器添加到您的应用程序中

现在我们需要将适当的过滤器添加到应用程序中,并在routes.php文件中设置其使用方式。

您可以将此过滤器添加到您的filters.php文件中,并根据您的需求进行调整

Route::filter('acl', function($route, $request)
{
    // we need this because laravel delete form sends POST request with {_method: 'DELETE'} as parameter
    $method = $request->has('_method') ? $request->input('_method') : $request->server('REQUEST_METHOD');
    
    if (!Acl::checkRoute($method, $request->server('REQUEST_URI'))) {
         App::abort(403);
    }
});

然后在routes.php中根据您的需求使用此过滤器。

Route::group(array('before' => 'acl', 'prefix' => '/admin'), function()
{
...
});

检查权限

以下是一些检查用户权限的方法

// Whether a user with ID 2 can see a list of all products
Acl::user(2)->permission('LIST_PRODUCTS')->check();

// Whether a user with ID 1 can edit product with ID 2
Acl::user(1)->permission('EDIT_PRODUCT', 2)->check();

// Can currently authenticated user edit product with ID 2
Acl::permission('EDIT_PRODUCT', 2)->check();

// Whether a user with ID 1 can edit and delete product with ID 2
Acl::user(1)->permission('EDIT_PRODUCT', 2)
            ->permission('DELETE_PRODUCT', 2)
            ->check();

// Can user with ID 1 access /products URL
Acl::user(1)->checkRoute('GET', '/products')

// Can currently authenticated user access /products URL
Acl::checkRoute('GET', '/products');

// Get me array of product IDs that user with ID 1 can edit
Acl::user(1)->permission('EDIT_PRODUCT')->getResourceIds();

// Get me array of product IDs that user with ID 1 can not edit
Acl::user(1)->permission('EDIT_PRODUCT')->getResourceIds(false);