Laravel 4.x 的 ACL 服务

2.0.1 2015-03-12 12:53 UTC

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);