kinulab/efficient-vote-bundle

提供增强选民安全性能的系统

安装次数: 1,680

依赖项: 0

建议者: 0

安全性: 0

星级: 3

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

0.2.1 2018-02-27 07:02 UTC

This package is auto-updated.

Last update: 2024-09-26 11:51:31 UTC


README

使用 Symfony,您可以通过访问控制列表(ACL)或通过投票者来安装访问管理。ACL 难以实现,而投票者存在性能问题。此包提供了一种在不影响性能的情况下享受投票者简单性的方法。

背景

投票者的性能问题来自 AccessDecisionManager 服务。其角色是要求每个投票者知道当前用户是否被允许执行特定操作(例如 ROLE_SUPER_ADMIN)。问题是该服务不知道大多数投票者将放弃支持,因为它们不支持该属性。

因此,如果您的应用程序有 10 个投票者,并且您的模板使用了 10 次的 is_granted() 函数,它将进行 100 次调用。如果您的应用程序增长,这将成为瓶颈。

为了解决这个问题,此包覆盖了默认的 AccessDecisionManager 服务。使用新的服务,您可以注册您的投票者并指定支持的属性。访问决策管理器将不会调用您的投票者,除非他具备该属性的资格。

安装

composer require kinulab/efficient-vote-bundle

然后在您的 app/config/AppKernel.php 中添加

    public function registerBundles()
    {
        $bundles = [
            // [...]
            new Kinulab\EfficientVoteBundle\KinulabEfficientVoteBundle(),
        ];

用法

新的访问决策管理器将假设您根据类型和领域组织您的投票者。

然后您必须使用以下形式命名您的角色

ROLE _ HOUSE _ OPEN_DOOR
|__|   |___|   |_______|
type   domain  attribute

您的投票者类保持与标准的 Symfony 投票者完全一样。唯一的不同之处在于投票者服务的注册。

使用标准投票者,您的服务注册如下

# app/config/services.yml
services:
    app.host_voter:
        class: AppBundle\Security\hostVoter
        # small performance boost
        public: false
        tags:
            - { name: security.voter }

使用此包,您现在应将服务注册如下

# app/config/services.yml
services:
    app.host_voter:
        class: AppBundle\Security\hostVoter
        # small performance boost
        public: false
        tags:
            # big performance boost
            - { name: security.efficient_voter, type: ROLE, domain: HOUSE }

使用此配置,上述投票者将仅针对 ROLE_HOUSE_* 属性调用。

注意

新的访问决策管理器仍然与原始版本兼容。因此,如果您有一些以旧方式注册的投票者,它们仍然会按预期工作(但会频繁调用)。