Flexible permissions

Proporciona un framework para recopilar, calcular y almacenar en caché permisos de múltiples fuentes, habilitando el Control de Acceso Basado en Políticas (PBAC) para sitios Drupal.

flexible_permissions
12,260 sites
26
drupal.org

Instalar

Drupal 11, 10 v2.0.1
composer require 'drupal/flexible_permissions:^2.0'
Drupal 9 v1.1.0
composer require 'drupal/flexible_permissions:^1.1'

Overview

El módulo Flexible Permissions proporciona un sistema centralizado de cálculo y almacenamiento en caché de permisos que permite recopilar permisos de múltiples fuentes. Al utilizar una cadena de calculadores de permisos, permite un sofisticado Control de Acceso Basado en Políticas (PBAC) donde los permisos pueden variar según cualquier criterio como tiempo, contexto o estado de membresía.

El módulo introduce el concepto de "scopes" (ámbitos) que determinan dónde deben verificarse los permisos. Mientras que los permisos estándar de Drupal operan en el scope "default", las implementaciones pueden definir scopes personalizados. Por ejemplo, el módulo Group define scopes como "group_outsider", "group_insider" y "group_individual" para manejar permisos de manera diferente según el estado de membresía.

La capa de caché utiliza VariationCache de Drupal para manejar inteligentemente las variaciones de caché, asegurando que los cambios dinámicos de permisos (como los basados en horarios de oficina) se almacenen en caché y sirvan correctamente. Esto hace posible tener permisos contextuales que se adaptan automáticamente a condiciones cambiantes mientras mantienen un excelente rendimiento.

Nota: Este módulo está ahora obsoleto. Drupal 10.3+ incluye la API de Access Policy en el núcleo, que proporciona funcionalidad similar. El módulo continúa funcionando como una capa de compatibilidad que convierte las políticas de Flexible Permissions en políticas de la API Access Policy del núcleo.

Features

  • Sistema de permisos basado en scopes que permite definir permisos para diferentes contextos (ej., por grupo, por dominio, por tienda)
  • Calculador de permisos en cadena que agrega permisos de múltiples servicios calculadores
  • Construcción de permisos en dos fases: cálculo inicial seguido de fase de alteración para modificaciones
  • Almacenamiento en caché inteligente usando VariationCache que maneja redirecciones de caché y variaciones basadas en contextos de caché
  • Caché de doble capa con caché persistente y caché de memoria estática para rendimiento óptimo
  • Soporte para cambio de cuenta para calcular y almacenar en caché correctamente permisos para cualquier cuenta de usuario
  • Integración con la API Access Policy del núcleo de Drupal (Drupal 10.3+) como capa de compatibilidad
  • Los elementos de permiso pueden marcarse como admin para omitir verificaciones de permisos individuales dentro de un scope
  • Objetos de valor inmutables (CalculatedPermissions) y objetos de construcción refinables (RefinableCalculatedPermissions) para manejo seguro de permisos
  • Protección de modo de construcción que previene la eliminación accidental de permisos durante la fase de cálculo inicial

Use Cases

Control de acceso basado en tiempo

Crear un calculador de permisos que otorgue permisos de edición solo durante horario de oficina. El calculador verificaría la hora actual y agregaría permisos de edición solo entre las 9 AM y 5 PM en días laborales. El caché variaría automáticamente por tiempo para servir los permisos correctos a lo largo del día.

Permisos basados en grupos

Como lo implementa el módulo Group, definir diferentes scopes de permisos para usuarios basados en su relación con un grupo. Los externos (no miembros) obtienen un conjunto de permisos, los internos (miembros) obtienen otro, e individuos específicos pueden tener permisos personalizados basados en sus roles de membresía.

Control de acceso multi-dominio

Para instalaciones multi-sitio usando Domain Access, crear calculadores que otorguen permisos basados en el dominio actual. Los editores de contenido podrían tener acceso completo en sus dominios asignados pero acceso de solo lectura en otros.

Acceso admin condicional

Otorgar privilegios de administrador dentro de un scope basado en ciertas condiciones. Por ejemplo, los editores senior podrían tener acceso admin en scopes de gestión de contenido durante períodos tranquilos, volviendo automáticamente a permisos regulares durante momentos de alto tráfico.

Sistema de permisos en capas

Combinar múltiples calculadores de permisos para construir control de acceso complejo. Un calculador podría proporcionar permisos base desde roles, otro podría agregar permisos basados en propiedad del contenido, y un tercero podría otorgar acceso elevado temporal basado en flujos de trabajo.

Tips

  • Siempre implementa getPersistentCacheContexts() correctamente - si los permisos varían por alguna condición, esa condición debe estar representada como un contexto de caché
  • Usa PermissionCalculatorBase como tu punto de partida en lugar de implementar la interfaz directamente
  • Prefiere PermissionCalculatorAlterInterfaceV2 sobre la interfaz alter original ya que proporciona contexto de cuenta y scope
  • Recuerda que los elementos se fusionan, no se sobrescriben, durante el modo de construcción - usa la fase de alteración si necesitas modificar elementos existentes
  • Al establecer isAdmin a true en un CalculatedPermissionsItem, el array de permisos se ignora - los elementos admin tienen todos los permisos
  • Para Drupal 10.3+, considera usar Access Policies nativas en su lugar. Este módulo proporciona una capa de compatibilidad pero el código nuevo debería usar las APIs del núcleo
  • El módulo aplica una etiqueta de caché 'flexible_permissions' a todos los permisos calculados, haciendo fácil la invalidación masiva

Technical Details

Troubleshooting 5
Los permisos no se actualizan después de cambios

Limpiar el bin de caché 'flexible_permissions'. Puedes usar Drush: drush cr, o invalidar la etiqueta de caché 'flexible_permissions' programáticamente.

Se lanza CalculatedPermissionsScopeException

Asegúrate de que tu calculador solo retorne permisos para el scope que fue solicitado. Verifica que no estés agregando accidentalmente elementos con diferentes nombres de scope en tu método calculatePermissions().

Los permisos no persisten correctamente para diferentes usuarios

Si tus permisos varían por usuario, asegúrate de incluir 'user' o contextos de caché apropiados relacionados con el usuario en tu método getPersistentCacheContexts(). El calculador en cadena usa cambio de cuenta para manejar esto correctamente.

No se pueden eliminar elementos durante el cálculo

La eliminación de elementos solo está permitida después de deshabilitar el modo de construcción. El calculador en cadena deshabilita el modo de construcción automáticamente antes de la fase de alteración. Si necesitas eliminar elementos, implementa PermissionCalculatorAlterInterface o PermissionCalculatorAlterInterfaceV2.

Advertencia de módulo obsoleto

Este módulo está obsoleto a favor de la API Access Policy del núcleo de Drupal (disponible en Drupal 10.3+). Considera migrar a políticas de acceso nativas. El módulo continúa funcionando como capa de compatibilidad durante el período de transición.

Security Notes 4
  • Nunca hagas getPersistentCacheContexts() condicional a nada más que el parámetro scope. Los contextos de caché condicionales pueden llevar a vulnerabilidades de escalación de privilegios.
  • No uses contextos de caché que dependan de permisos calculados dentro de tus cálculos, ya que esto crea un bucle infinito.
  • Ten cuidado al implementar alterPermissions() - eliminar o modificar permisos incorrectamente puede llevar a acceso no intencionado.
  • Al extender el sistema de permisos, siempre considera las implicaciones de seguridad de otorgar estado admin dentro de un scope, ya que los elementos admin omiten todas las verificaciones de permisos.