optimeconsulting/acl_bundle

1.1.14 2023-12-06 17:45 UTC

This package is auto-updated.

Last update: 2024-09-06 19:20:49 UTC


README

用于管理访问控制的Bundle。

安装

composer require "optimeconsulting/acl_bundle" "^1.0@dev"

配置

config/bundles.php 中添加作为bundle

<?php

return [
    ...
    Optime\Acl\Bundle\OptimeAclBundle::class => ['all' => true],
];

选项配置

创建/调整 config/packages/optime_acl.yaml 文件

optime_acl:
    # Se puede deshabilitar para pruebas
    enabled: true

    # Opcional. Permite desactivar la cache de resultados de los voters
    # Por defecto es true
    # Tiene sentido solo cuando los roles del usuario son dinamicos durante la misma sesión.
    #cache_voters: false

    # Opcional. Se puede indicar un servicio propio para manejo de roles/perfiles
    # Dicho servico debe implementar la interfaz \Optime\Acl\Bundle\Security\User\RolesProviderInterface
    # Por defecto usa los roles del security.yaml
    # roles_provider: LoyaltyRolesProvider 

    # Prefijos de Namespace donde se van a buscar los recursos/referencias del proyecto
    # Son Namespaces de los controladres del proyecto y de los
    # diferentes bundles que esté usando la app.
    resources:
        - App\   # Ruta del propio proyecto
        - Optime\ # Ruta de todo lo que comienze con el namespace Optime
        # - "" # Con esto registramos todas las posibles rutas del proyecto y bundles como recursos.
        # - Optime\Acl\Bundle\ # Ejemplo de Bundle especifico

    # Opcional. Se puede indicar nombres de Controladores o namespaces a excluir de los
    # posibles recursos de seguridad en la aplicación.
    # excluded_resources:
    #    - App\Controller\SecurityController* # Excluye todo lo que comienze por el valor dado.
    #    - *Email\Bundle*                     # Excluye todo lo que contenga el valor dado.
    #    - *UserController::index             # Excluye lo que termine por el valor dado.

创建 config/routes/optime_acl.yaml 文件

optime_acl:
    resource: "@OptimeAclBundle/src/Controller/"
    type: annotation
    prefix: /{_locale}/admin/access-control

运行doctrine命令

symfony console doctrine:schema:update -f

使用方法

配置完bundle后,可以通过路由 /{_locale}/admin/access-control 访问,在那里可以配置应用中每个控制器的权限。

该bundle主要处理三个术语,理解这些术语对于正确使用工具至关重要

  • 角色:将是访问应用的用户类型或用户组。
  • 引用:是用户从浏览器访问的控制器和动作。
  • 资源:是为一组引用(控制器)命名的名称,以配置它们的权限。**角色是与这些资源相关联的**。

例如,我们可以有一个名为 user list 的资源,仅由 ROLE_ADMIN 角色访问,并且内部该资源将与指定的角色和某些引用(控制器)相关联,如

  • App\Controller\UserController::list
  • App\Controller\UserController::listInactivates
  • App\Controller\UserController::showUserData

而另一个名为 user edit 的资源将由 ROLE_SUPER_ADMIN 角色访问,并且内部将与引用(控制器)相关联

  • App\Controller\UserController::create
  • App\Controller\UserController::edit
  • App\Controller\UserController::changeStatus
  • App\Controller\UserController::delete

访问验证

通过使用Symfony的安全系统来验证资源的访问。更具体地说,使用安全投票者

有两种方式来验证资源的访问

* Por nombre de recurso.
* Por nombre de ruta.

示例

# Controlador:
public function edit() {
    # Por el nombre de un recurso
    if (!$this->isGranted("resource", "user edit")) {
        die("No tiene acceso");
    }
    
    // Por el nombre de una ruta
    if (!$this->isGranted("resource_route", "ruta_usuario_editar")) {
        die("No tiene acceso");
    }
}

# Atributo en controlador:
#[IsGranted("resource", "user")]
public function edit() {
    # ...
}

在twig模板中

{% if is_granted("resource", "user edit") %}
    <a href="{{ path("ruta_user_edit", {id: item.id}) }}">Edit</a>
{% endif %}

{% if is_granted("resource", "user") %}
    {# 
    Si solo preguntamos si tiene acceso a user, será verdadero si tiene acceso a algún 
    recurso hijo de user o directamente a user 
    #}
    <a href="{{ path("ruta_user_show", {id: item.id}) }}">Show</a>
{% endif %}

{% if is_granted("resource_route", "ruta_user_show") %}
    <a href="{{ path("ruta_user_show", {id: item.id}) }}">Show</a>
{% endif %}

{% if is_granted("resource_route", "ruta_user_edit") %}
    <a href="{{ path("ruta_user_edit", {id: item.id}) }}">Edit</a>
{% endif %}

使用验证的最灵活方式是通过路由而不是资源名称。因为这样,如果后端配置中某个路由名称改变,我们就不需要更改代码。