optimeconsulting / acl_bundle
1.1.14
2023-12-06 17:45 UTC
Requires
- php: >=8.0
- symfony/framework-bundle: ^5.4|^6.0
- symfony/security-bundle: ^5.4|^6.0
- symfony/string: ^5.4|^6.0
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 %}
使用验证的最灵活方式是通过路由而不是资源名称。因为这样,如果后端配置中某个路由名称改变,我们就不需要更改代码。