vrimeikis / acl
Laravel 4.x 的 ACL 服务
Requires
- php: >=5.3.0
- illuminate/support: 4.*
- rhumsaa/uuid: ~2.7
This package is not auto-updated.
Last update: 2024-09-21 06:39:30 UTC
README
此插件允许您将应用不同区域中的用户访问权限分开。此 acl 插件面向数据库。例如,您有一个具有管理部分和前端部分的应用程序,但您需要这两个部分分别由 acl 控制。我的插件允许您非常容易地做到这一点。您必须将所有模型扩展为使用 Uuid4 方法的 UuidModel。
注意
!!! Dev version has strong changes on db and functions !!!
安装
composer.phar require vrimeikis/acl dev-master
配置
在配置目录中创建一个名为 acl.php 的新文件,并将此代码段放入该文件。
<?php
//acl configuration file
return [
'zones' => ['superadmin', 'admin', 'basic'], //array of basic zones
'default_zone' => 'superadmin', //default zone (have to be in array of zones)
'admin_zone' => 'admin', //default zone (have to be in array of zones)
'basic_zone' => 'basic', //basic zone (have to be in array of zones)
// zones valid controller for individual zone
'zone_valid_controllers' => [
'admin' => ['AdminController', 'PersonalDataController', 'RemindersController'],
'basic' => ['AdminController', 'PersonalDataController', 'RemindersController'],
],
//valid actions array for menu
'valid_menu_route_actions' => [
'index',
],
//ignore seeding controllers for menu
'ignore_controllers' => [
'ResourcesController',
],
//default controllers (none editable and ignoring on modicications)
'default_controllers' => [
'AdminController',
'RemindersController',
'ResourcesController',
],
];
设置
首先,您需要在应用程序服务提供者中添加
'IS\Acl\AclServiceProvider'
并在您的应用程序外观中添加
"Acl" => 'IS\Acl\Facades\Acl'
这允许您在应用程序中使用 Acl 外观。
此插件由命令管理,因此您必须发出此命令以设置插件
php artisan acl:setup //this command run database migrations and controller scanning
控制器扫描
您不必担心您已添加哪些控制器和路由,只需考虑将它们添加到 ACL 插件中。每次您添加新的控制器或路由时,只需发出此命令即可
php artisan acl:scan
种子数据
在扫描后,运行此命令以添加用于使用任何操作的关联
php artisan acl:seed //this command seeds the database and allows default group to perform any action
将管理菜单种子到数据库
如果您在管理组中创建新路由,则对数据库进行种子
php artisan acl:menu
用户识别
然后,您在 filters.php 中创建一个过滤器,并使用此示例代码将其添加到路由中。
Route::filter('acl', function()
{
// zone type and id array by user ACL
$zone = Acl::getGroupsTypeAndIdByUserId(Auth::id());
if ($zone)
{
// this passes the user acl group id into plugin
Acl::$zone['type']()->identify($zone['group_id']);
// if user is allowed returns (bool) true if not returns (bool) false
if(!Acl::allowed())
{
//here goes your code for error exception
App::abort(403, 'Unauthorized action.');
}
}
else
{
App::abort(403, 'Unauthorized action.');
}
});
多个区域
如果您想使用具有多个区域的插件,只需将新区域添加到 acl.php 配置文件中,并像这样使用它
Acl::zonename()->identify($id);
设置权限
首先,您需要创建一种显示与操作(acos)相关的组(aros)权限的形式。为此,您可以使用这些命令
列出所有资源(acos)
Acl::getResources();
列出区域中的所有组(aros)
Acl::zonename()->getGroups();
要检查组是否允许执行操作,您可以使用此方法
Acl::zonename()->getPermission((string) $aco_id, (string) $aro_id);
要为特定的 aco 和 aro 设置权限,您可以使用此方法
Acl::zonename()->set((string) $aco_id, (string) $aro_id, (bool) $allowed, (string) $type);
ACL 用户组
此 acl 插件面向组,因此每个 acl 检查都在组级别执行。这意味着每个用户都必须在 acl 组中,插件不关心用户 ID,但它关心 acl_group_id。以下示例中 zonename 将是您的区域名称,例如 default。
添加新组
Acl::zonename()->addGroup((string) $name, (string) $type (bool) $isdefault);
编辑现有组
Acl::zonename()->editGroup((string) $groupID, array("name"=> (string) $zonename, "type" => (string) $type, "default"=> (bool) $isdefault));
删除组
Acl::zonename()->deleteGroup((string) $groupID);
列出所有组
Acl::getAllGroups();
按 ID 分组
Acl::getGroupById((string) $id);
##Zones
Those methods allows you to get list of all zones and get default zone name.
###List all zones
Method returns array of all zone names.
Acl::getZones();
###Get default zone name
Method returns default zone name as string.
Acl::getDefaultZone();
###Get admin menu list
Method returns admin menu list.
Acl::getAdminMenu($artificial = '0', $active = '1', $userId = NULL);