mdsys / laravel-acl
Laravel 4 的 ACL 组件
Requires
- php: >=5.3.0
- illuminate/support: 4.0.x
Requires (Dev)
- orchestra/testbench: 2.0.*
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-24 00:50:09 UTC
README
Laravel 4 的 ACL 组件。
安装
首先,您需要通过 Composer 安装此软件包。编辑您的项目 composer.json 文件以要求 vivify-ideas/acl。
"require": {
"vivify-ideas/acl": "dev-master"
},
"minimum-stability" : "dev"
接下来,从终端更新 Composer
composer update
一旦此操作完成,您需要将服务提供者添加到您的应用中。打开 app/config/app.php,并在提供者数组中添加一个新的项目。
'VivifyIdeas\Acl\AclServiceProvider',
并且还需要在别名数组中添加新的别名。
'Acl' => 'VivifyIdeas\Acl\Facades\Acl',
最后一步是为 ACL 创建数据库结构。您可以通过运行以下 artisan 命令轻松完成此操作
php artisan acl:install
这将使用当前的权限提供者(Eloquent)创建必要的数据库结构。完成后,您应该在数据库中拥有六个新表:acl_permissions、acl_groups、acl_user_permissions、acl_roles、acl_roles_permissions 和 acl_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);