matthimatiker/feature-flag-bundle

此包已被废弃且不再维护。没有建议的替代包。

在巨人的肩膀上实现功能标志和高级角色管理。

0.1.0 2016-06-11 10:15 UTC

This package is not auto-updated.

Last update: 2024-04-23 20:26:49 UTC


README

Build Status Coverage Status

此包建立在Symfony复杂的安全系统之上,并提供将功能分配给角色的方法。它可以帮助您

  • 改变您的思维方式:不要定义谁可以访问某些功能,而是定义哪些功能是可用的。
  • 将任何功能(或角色)分配给未登录的访客。
  • 利用您现有的Symfony知识:访问控制与纯Symfony中的方式相同。

安装

通过Composer安装此包

php composer.phar require matthimatiker/feature-flag-bundle

在您的内核中启用此包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Matthimatiker\FeatureFlagBundle\MatthimatikerFeatureFlagBundle(),
        // ...
    );
    // ...
}

使用方法

配置功能

功能分配给角色。您可以通过Symfony的分层角色将功能和角色连接到您的security.yml

security:
    # ...
    
    role_hierarchy:
        # Start with a role and assign the accessible features.
        ROLE_USER:
            - FEATURE_BLOG
            
        # You can organize your features in groups and assign sub-features.
        # These are inherited just like roles.
        FEATURE_BLOG:
            - FEATURE_BLOG_WRITE
            - FEATURE_BLOG_READ
            
        # Features may depend on IS_AUTHENTICATED_* permissions.
        # That is useful to assign features to all visitors (logged in or not):
        IS_AUTHENTICATED_ANONYMOUSLY:
            - FEATURE_NEWSLETTER_REGISTRATION
            
        # The role ROLE_ANONYMOUS is used to assign features to visitors that are not logged in.
        ROLE_ANONYMOUS:
            - FEATURE_LOGIN

security.yml是映射功能到角色的中心位置。为了区分功能和角色,它们以FEATURE_*为前缀。

功能分组

类似于层次结构中的正常角色,功能可以分组。这允许您从子功能中组合新的功能

FEATURE_BLOG_USER:
    - FEATURE_BLOG_READ
    - FEATURE_BLOG_WRITE

FEATURE_BLOG_ADMIN:
    - FEATURE_BLOG_USER
    - FEATURE_BLOG_DELETE

在上面的例子中,任何具有权限FEATURE_BLOG_ADMIN的用户也将继承权限FEATURE_BLOG_WRITEFEATURE_BLOG_WRITEFEATURE_BLOG_DELETE。以这种方式组合功能可以保证细粒度的权限控制。想要防止删除博客文章?只需从层次结构中删除FEATURE_BLOG_DELETE即可。

面向所有用户的功能

在纯Symfony中,您不能将角色分配给匿名用户。此包通过允许将角色和功能分配给Symfony的IS_AUTHENTICATED_*层次结构中的权限来克服这一限制。

请注意,现有的IS_AUTHENTICATED_*权限的规则适用。例如,IS_AUTHENTICATED_ANONYMOUSLY对所有访问者都可用,包括访客和已登录用户。这意味着任何分配给IS_AUTHENTICATED_ANONYMOUSLY的功能将对所有人可用。

仅面向访客的功能

在标准Symfony中,无法将角色分配给未登录的用户。此包通过引入特殊角色ROLE_ANONYMOUS来消除这一限制。ROLE_ANONYMOUS仅分配给匿名用户。一旦用户登录,她将失去该角色。

ROLE_ANONYMOUS可以用于角色层次结构配置,将功能分配给访客

ROLE_ANONYMOUS:
    - FEATURE_LOGIN

在角色层次结构中管理访客功能允许您通过简单的配置更改启用和禁用这些功能。

访问控制

应使用Symfony中现有的机制来检查功能访问。当然,您也可以仍然检查对角色的访问,尽管这可能不是必要的。

控制器操作

您可以使用与角色相同的方式检查对控制器操作的访问。

/**
 * @Security("has_role('FEATURE_NEWSLETTER_REGISTRATION')")
 */
public function myAction($name)
{
    // ...
}

Twig 模板

在您的 Twig 模板中,您可以使用 is_granted() 函数

{% if is_granted('FEATURE_NEWSLETTER_REGISTRATION') %}
    <a href="...">Register now</a>
{% endif %}

其他区域

您可以在之前使用角色的任何地方检查功能,例如在 access_control 部分 中,与 Symfony 的 控制器辅助方法 或直接使用 security.authorization_checker 服务

已知问题和限制

此捆绑包用于通过安全配置管理对功能的访问,因此权限更改也需要配置更改。它不提供实时启用和禁用功能的手段,尽管可以通过 动态角色(仅提及一种方法)实现。然而,由于这是一个非常具体的应用程序主题,实时功能管理目前不在此捆绑包的范围内。