hanaboso/acl-bundle

Hanaboso - acl-bundle

1.9.0 2024-06-20 15:09 UTC

README

Build Status Coverage Status PHPStan Downloads

安装

  • 通过composer下载包
composer require hanaboso/acl-bundle

资源

所有由ACL保护的资源与操作必须通过枚举和symfony参数进行注册。下面的配置显示了资源枚举和操作枚举的注册,以及标记属于给定资源的数据库文档。

acl_use_cache允许使用redis进行缓存,这样规则就不需要每次都从数据库加载。

parameters:
    resource_enum: Hanaboso\AclBundle\Enum\ResourceEnum
    action_enum: AclBundleTests\testApp\ExtActionEnum
    acl_use_cache: true

    db_res:
        resources:
            # Add new resources to ResourceEnum class
            user: Hanaboso\UserBundle\Document\User
            tmp_user: Hanaboso\UserBundle\Document\TmpUser
            token: Hanaboso\UserBundle\Document\Token
            file: Hanaboso\CommonsBundle\FileStorage\Document\File
            group: Hanaboso\AclBundle\Document\Group
            rule: Hanaboso\AclBundle\Document\Rule

    # Optionals - can be empty: ~
    resource_actions:
        # [read, write, delete] by default (set in MaskFactory)
        default_actions: ['read', 'write', 'delete', 'test']
        # specific actions on top of default ones
        resources:
            token: ['test2']

resource_actions是可选参数,允许扩展默认的['read', 'write', 'delete']操作。最多允许32个不同的操作。

规则

规则分为两个独立的组。标准规则和所有者规则。

所有者规则仅在对象包含所有者属性且其ID与登录用户匹配时才应用。

在fixture_groups下设置的规则是全局的,适用于所有实例,而不管所有权如何。每个规则都有

  • level:组的优先级。如果ACL规则和组可由用户编辑,则每个用户只能编辑自己及以下优先级的(保护superadmin不受低优先级admin的影响)
  • extends:包括指定组中的规则
  • users:预生成的用户
  • rules:指定给定组允许的资源及其所有规则
parameters:
    acl_rule:
        owner:
            # Key must match with key in acl.yml under resources
            user:   ['read', 'write']
            group:  ['read', 'write']

        fixture_groups:
            admin:
                level: 1
                extends:        ['user', 'test']
                users:
                    - {email: 'root@hanaboso.com', password: 'root'}
                rules:
                    group:      ['read']
                    user:       ['read', 'write', 'delete']
                    tmp_user:   ['read', 'write', 'delete']
                    token:      ['read', 'write']
                    topology:   ['read', 'write']
                    node:       ['read', 'write']
                    file:       ['read', 'write']
            user:
                level: 5
                extends:        ['test']
                users:
                rules:
                    topology:   ['read']
                    node:       ['read']
                    file:       ['read']

实体/文档

AclBundle依赖于UserBundle,并且它自身的实体/文档都必须注册到doctrine。

ORM映射

UserEntity:
    type: annotation
    is_bundle: false
    dir: "%src_dir%/src/Entity"
    prefix: Hanaboso\UserBundle\Entity
AclEntity:
    type: annotation
    is_bundle: false
    dir: "%src_dir%/src/Entity"
    prefix: Hanaboso\AclBundle\Entity

ODM映射

UserDocument:
    type: annotation
    is_bundle: false
    dir: "%src_dir%/src/Document"
    prefix: Hanaboso\UserBundle\Document
AclDocument:
    type: annotation
    is_bundle: false
    dir: "%src_dir%/src/Document"
    prefix: Hanaboso\AclBundle\Document

代码中的使用

通过AccessManager的方法isAllowed(string $action, string $resource, UserInterface $user, $object = NULL)检查给定用户的规则

请求操作与资源与上述注册的枚举进行验证。UserInterface来自UserBundle,代表登录用户。Object是可选参数,可以是对象或其ID。

示例

isAllowed(ActionEnum::READ, ResourceEnum::Node, $loggedUser);
isAllowed(ActionEnum::READ, ResourceEnum::Node, $loggedUser, '1258');
isAllowed(ActionEnum::READ, ResourceEnum::Node, $loggedUser, $resource);

对象参数的使用

  • NULL -> 检查用户是否有写权限或GroupPermission有读和删除权限isAllowed(ActionEnum::READ, ResourceEnum::Node, $loggedUser); 如果允许则返回TRUE,否则抛出异常

  • string -> 想要的实体的IDisAllowed(ActionEnum::READ, ResourceEnum::Node, $loggedUser, '1258'); 如果找到并用户有请求操作权限则返回所需的实体,否则抛出异常

  • object -> 检查给定实体的权限isAllowed(ActionEnum::READ, ResourceEnum::Node, $loggedUser, $something); 返回给定的对象或抛出异常

  • 其他格式如数组或int将只会抛出异常

组与规则的生成

所有必需的实体/文档都是通过fixtures生成的。创建新规则后,它也可以通过fixtures添加,同时它也会检查唯一性。