adjustit/php-abac

用于在 PHP 应用程序中实现基于属性的访问控制(ABAC)的库

维护者

详细信息

github.com/adjustit/php-abac

源代码

安装: 288

依赖: 0

建议: 0

安全性: 0

星星: 0

关注者: 2

分支: 30

v2.1.2.1 2017-03-14 03:37 UTC

README

基于属性的访问控制(ABAC)实现库

(https://packagist.org.cn/packages/adjustit/php-abac)

简介

此库旨在在您的 PHP 应用程序中实现 ABAC 概念。

该概念是通过使用属性来管理访问控制:来自用户、资源和环境。

它允许我们根据用户对象的属性以及可选的访问对象的属性来定义规则。

这些规则将在您的应用程序中进行检查,以确定用户是否被允许执行某个操作。

以下链接解释了 ABAC 是什么

安装

使用 composer

在您的 composer.json 文件中写入以下行

"require" : {
    "adjustit/php-abac": "dev-master"
}

然后只需

composer install

然后您需要配置应用程序的属性和规则。

有关此内容的更多详细信息,请参阅专用文档

文档

使用示例

只有规则中定义的用户属性的使用示例

在这个例子中,我们有一个单个对象,代表当前用户。

该对象具有属性,并提供获取器方法来访问值。

例如,我们可以编写

<?php

use PhpAbac\Abac;

class User{
    protected $id;

    protected $isBanned;

    public function getId() {
        return $this->id;
    }

    public function setIsBanned($isBanned) {
        $this->isBanned = $isBanned;

        return $this;
    }

    public function getIsBanned() {
        return $this->isBanned;
    }
}

$user = new User();
$user->setIsBanned(true);

$abac = new Abac([
    'policy_rule_configuration.yml'
]);
$abac->enforce('create-group', $user);

规则检查的属性可以是

同时使用用户和对象属性的使用示例

use PhpAbac\Abac;

$abac = new Abac([
    'policy_rule_configuration.yml'
]);
$check = $abac->enforce('read-public-group', $user, $group);

检查的属性可以是

动态属性的使用示例

<?php

use PhpAbac\Abac;

$abac = new Abac([
    'policy_rule_configuration.yml'
]);
$check = $abac->enforce('edit-group', $user, $group, [
    'dynamic-attributes' => [
        'group-owner' => $user->getId()
    ]
]);

引用属性的使用示例

配置应该是

attributes:
    group:
        class: MyApp\Model\Group
        type: resource
        fields:
            author.id:
                name: Author ID
    app_user:
        class: MyApp\Model\User
        type: user
        fields:
            id:
                name: User ID

rules:
    remove-group:
        attributes:
            app_user.id:
                comparison: object
                comparison_type: isFieldEqual
                value: group.author.id

然后代码

<?php

use PhpAbac\Abac;

$abac = new Abac([
    'policy_rule_configuration.yml'
]);
$check = $abac->enforce('remove-group', $user, $group);

使用缓存的示例

$check = $abac->enforce('edit-group', $user, $group, [
    'cache_result' => true,
    'cache_ttl' => 3600, // Time To Live in seconds
    'cache_driver' => 'memory' // memory is the default driver, you can avoid this option
]);

对于唯一规则(ruleSet)的多个规则(rule)的示例。 每个规则都会被测试,并且在 ruleSet 中的第一个允许访问的规则后,处理将停止

配置应该是(alcoolaw.yml)

attributes:
    main_user:
        class: PhpAbac\Example\User
        type: user
        fields:
            age:
                name: Age
            country:
                name: Code ISO du pays
rules:
    alcoollaw:
        -
            attributes:
                main_user.age:
                    comparison_type: numeric
                    comparison: isGreaterThan
                    value: 18
                main_user.country:
                    comparison_type: string
                    comparison: isEqual
                    value: FR
        -
            attributes:
                main_user.age:
                    comparison_type: numeric
                    comparison: isGreaterThan
                    value: 21
                main_user.country:
                    comparison_type: string
                    comparison: isNotEqual
                    value: FR

然后代码

<?php

use PhpAbac\Abac;

$abac = new Abac([
    'alcoollaw.yml'
]);
$check = $abac->enforce('alcoollaw', $user);

传递给 Abac 类的规则根目录的示例。 此功能允许直接将策略定义规则目录路径传递给 Abac 类,而无需添加到所有文件中

假设我们有 3 个 yaml 文件

  • rest/conf/policy/user_def.yml
  • rest/conf/policy/gunlaw.yml

PHP 代码可以是

<?php

use PhpAbac\Abac;

$abac = new Abac([
    'user_def.yml',
    'gunlaw.yml',
],[],'rest/conf/policy/');
$check = $abac->enforce('gunlaw', $user);
 

贡献

如果您想贡献,请不要犹豫,将库分叉并提交拉取请求。

您还可以报告问题,提出改进建议,自由提供建议和关于此库的反馈。

它还没有完成,还有很多功能要实现以使其更好。如果您想成为此库改进的一部分,请告诉我们!