libre-informatique/security-bundle

管理安全规则和访问控制

0.2 2017-03-07 10:23 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:36:56 UTC


README

此项目已弃用,不再维护。你应该使用 https://github.com/libre-informatique/SonataSyliusUserBundle

SymfonyLibrinfoSecurityBundle

管理安全规则和访问控制

"libre-informatique" 包

    // ...
    public function registerBundles()
    {
        $bundles = array(
            // before Librinfo bundles
            new JMS\AopBundle\JMSAopBundle(),
            new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
            new JMS\DiExtraBundle\JMSDiExtraBundle($this),
            
            // After...
            new Librinfo\SecurityBundle\LibrinfoSecurityBundle(),
            // ...
        );
    }

配置

通用配置

你应在 app/config/security.yml 中拥有此类配置

# app/config/security.yml

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4

            logout:       true
            anonymous:    ~

    access_control:
        - { path: ^/(css|images|js), role: IS_AUTHENTICATED_ANONYMOUSLY } # allow assets for anonymous users
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

jms_security_extra:
    secure_all_services: false
    enable_iddqd_attribute: false
    expressions: true
    voters:
        disable_authenticated: false
        disable_role:          false
        disable_acl:           true
    method_access_control: {}
    
    # Allows you to specify access control rules for specific methods, such
    # as controller actions
    method_access_control:
        'FOSUserBundle:SecurityController:logoutAction$': 'isAuthenticated()'

默认配置

默认安全配置已在 LibrinfoSecurityBundle/Resources/config/security.yml 中设置。

# LibrinfoSecurityBundle/Resources/config/security.yml
librinfo.security:
    # Checking Controllers and/or Services access
    method_access_control:
        'FOSUserBundle:SecurityController:loginAction$': 'isAnonymous()'
        'SonataAdminBundle:Core:dashboard$': 'hasRole("ROLE_USER")'
        'Librinfo\\UIBundle\\Twig\\Extension\\AdminMenu::showAdminMenu$': 'hasRole("ROLE_CRM_MANAGER")'
    # Defining custom Roles hierarchy (as a tree)
    security.role_hierarchy.roles:
        ROLE_SUPER_ADMIN:
            - ROLE_CRM_MANAGER:
                - ROLE_CRM_CONTACT_MANAGER:
                    - ROLE_CRM_CONTACT_VIEWER:
                        - ROLE_USER
                - ROLE_CRM_ORGANISM_MANAGER:
                    - ROLE_CRM_ORGANISM_VIEWER:
                        - ROLE_USER
                - ROLE_CRM_ADMIN:
                    - ROLE_USER

定义自定义角色层次结构和自定义访问控制规则

你可以通过创建新的配置文件 app/config/application_security.yml 来定义你自己的角色层次结构和访问控制规则。

非常重要,请将所有角色都以前缀「ROLE_」开头。这是因为 Symfony 的 RoleVoter 默认使用此前缀。

在此文件中,你可以在 method_access_control: 键下定义你自己的访问控制逻辑。你可以在 security.role_hierarchy.roles: 键下定义你自己的角色层次结构。

librinfo.security:
    # ...
    security.role_hierarchy.roles:
        ROLE_SUPER_ADMIN:
            - ROLE_TEST_ADMIN:
                - ROLE_TEST_SUB_ADMIN:
                    - ROLE_USER
                - ROLE_TEST_SUB_USER:
                    - ROLE_TEST_SUB_SUB_USER:
                        - ROLE_USER
                - ROLE_TEST_SUB_OTHER:
                    - ROLE_TEST_SUB_SUB_OTHER:
                        - ROLE_TEST_SUB_SUB_SUB_OTHER:
                            - ROLE_USER
    method_access_control:
            'Librinfo\\UIBundle\\Twig\\Extension\\AdminMenu::showAdminMenu$': 'hasRole("ROLE_CRM_MANAGER")'

注意事项

  • 你的自定义规则将与在 LibrinfoSecurityBundle 包中定义的默认值以及其他包中的值合并。
  • 别忘了清除缓存,以便看到你的更改已生效。
  • 你的自定义层次结构将与 LibrinfoSecurityBundle 包的默认值以及其他使用此配置系统的包合并。

在包内定义自定义规则和角色

你可以在你的 src 目录中的任何包内定义自定义规则。

实现此目的有几个步骤

  • <YOURBUNDLE DIR>/Resources/config/security.yml 中创建你自己的 security.yml
  • 按照 [定义自定义角色层次结构和自定义访问控制规则](#Defining custom role hierarchy and custom access control rules) 中的描述添加你的规则
  • <YOUR BUNDLEDIR>/DependencyInjection/<YOURBUNDLE>Extension.php 中添加以下代码
public function load(array $configs, ContainerBuilder $container)
{
    // ...
    SecurityConfigurator::getInstance($container)->loadSecurityYml(__DIR__ . '/../Resources/config/security.yml');
    // ...
}