Modo de solo lectura de configuración

Bloquea la configuración de Drupal para prevenir cambios en la interfaz de administración mientras permite importaciones de configuración mediante Drush.

config_readonly
5,399 sites
73
drupal.org

Install

Drupal 11, 10, 9 v8.x-1.0
composer require 'drupal/config_readonly:8.x-1.0'

Overview

El módulo Configuration Read-only mode proporciona una capa de seguridad que bloquea todos los cambios de configuración de Drupal a través de la interfaz administrativa. Cuando está activado, cualquier intento de modificar la configuración mediante la interfaz será bloqueado, y los usuarios verán un mensaje de advertencia explicando que la configuración es de solo lectura.

El caso de uso principal es para entornos de producción donde la configuración debe estar bloqueada y solo modificarse a través de importaciones de configuración validadas desde un entorno de pruebas usando Drush. Esto asegura que los cambios de configuración en producción sean probados adecuadamente y controlados por versiones antes del despliegue.

El módulo funciona decorando el servicio de almacenamiento de configuración del núcleo de Drupal, interceptando todas las operaciones de escritura (write, delete, rename, deleteAll) y lanzando una excepción si la configuración de solo lectura está habilitada. Permite inteligentemente las importaciones de configuración mediante el ConfigImporter de Drush y las actualizaciones de base de datos a través de update.php para que procedan normalmente.

Un sistema flexible de lista blanca permite que configuraciones específicas permanezcan editables incluso cuando el modo de solo lectura está activo, soportando tanto coincidencias exactas como patrones con comodines.

Features

  • Bloquea todas las operaciones de escritura de configuración cuando el modo de solo lectura está habilitado mediante $settings['config_readonly'] = TRUE en settings.php
  • Deshabilita automáticamente los botones de envío en todos los formularios de configuración (ConfigFormBase, ConfigEntityListBuilder, ConfigTranslationFormBase) y muestra mensajes de advertencia
  • Permite que las importaciones de configuración de Drush procedan normalmente detectando el bloqueo de ConfigImporter
  • Permite que las actualizaciones de base de datos mediante update.php modifiquen la configuración según sea necesario
  • Soporta patrones de lista blanca para eximir configuraciones específicas de la protección de solo lectura usando coincidencias exactas o comodines (ej., 'system.performance' o 'block.block.*')
  • Los patrones de lista blanca pueden definirse en settings.php o mediante hook_config_readonly_whitelist_patterns()
  • Bloquea el formulario de importación de configuración individual, los formularios de habilitación/deshabilitación de módulos y el formulario de permisos de usuario cuando está activo
  • Muestra información de estado en la página de informe de estado de Drupal indicando si el modo de solo lectura está activo
  • Soporta activación condicional basada en variables de entorno (ej., solo habilitar en producción)
  • Proporciona un evento personalizado (ReadOnlyFormEvent) que permite a otros módulos personalizar qué formularios se marcan como de solo lectura

Use Cases

Bloquear configuración de producción

El caso de uso principal es bloquear la configuración en servidores de producción. Agrega lo siguiente a tu settings.php de producción para prevenir cualquier cambio de configuración a través de la interfaz de administración mientras permites importaciones de configuración mediante Drush: $settings['config_readonly'] = TRUE;

Configuración específica por entorno

Usa variables de entorno para habilitar condicionalmente el modo de solo lectura solo en producción. Ejemplo: if (isset($_ENV['AH_SITE_ENVIRONMENT']) && $_ENV['AH_SITE_ENVIRONMENT'] === 'prod') { $settings['config_readonly'] = TRUE; } Esto es útil para Acquia, Platform.sh u otros entornos de alojamiento que establecen variables de entorno.

Permitir configuraciones específicas

Cuando ciertas configuraciones necesitan permanecer editables en producción (ej., configuraciones de rendimiento o ubicaciones específicas de bloques), usa patrones de lista blanca: $settings['config_readonly_whitelist_patterns'] = ['system.performance', 'block.block.header_*'];

Protección solo para interfaz

Si quieres proteger contra cambios en la interfaz pero permitir cambios por CLI (menos seguro pero a veces necesario): if (PHP_SAPI !== 'cli') { $settings['config_readonly'] = TRUE; } Nota: Esto se desaconseja ya que permite a cualquiera con acceso shell o Drush modificar la configuración.

Interruptor basado en archivo

Para situaciones de emergencia, puedes basar el estado de solo lectura en la existencia de un archivo: if (!file_exists('/home/myuser/disable-readonly.txt')) { $settings['config_readonly'] = TRUE; } Esto permite deshabilitar rápidamente sin despliegue de código creando el archivo de interruptor.

Configuración multi-sitio

En configuraciones multi-sitio, define las configuraciones de solo lectura por sitio en el settings.php de cada sitio o usa configuraciones compartidas con anulaciones específicas por sitio para controlar qué sitios tienen la configuración de solo lectura habilitada.

Tips

  • Siempre prueba tus patrones de lista blanca en un entorno que no sea producción antes de desplegar a producción
  • Usa variables de entorno para habilitar condicionalmente el modo de solo lectura, facilitando la gestión entre diferentes entornos
  • El módulo muestra qué nombres de configuración necesitarían estar en lista blanca cuando un formulario es bloqueado - usa esta información para construir tu lista blanca
  • Considera usar hook_config_readonly_whitelist_patterns() en un módulo personalizado en lugar de settings.php para lógica de lista blanca más dinámica
  • Recuerda que las importaciones de configuración y las actualizaciones de base de datos siempre están permitidas independientemente de la configuración de solo lectura
  • El ReadOnlyFormEvent puede usarse para implementar lógica personalizada para determinar qué formularios deben ser de solo lectura
  • Los patrones de lista blanca soportan comodines (*) en cualquier lugar del patrón - 'foo.*.bar' coincide con 'foo.baz.bar'

Technical Details

Hooks 1
hook_config_readonly_whitelist_patterns

Permite a los módulos proporcionar patrones de lista blanca para configuraciones que deben permanecer editables cuando el modo de solo lectura está activo. Los patrones soportan comodines usando el carácter *.

Troubleshooting 5
El módulo está habilitado pero la configuración aún puede cambiarse

Habilitar el módulo por sí solo no activa la protección. Debes agregar $settings['config_readonly'] = TRUE; a tu archivo settings.php para activar el modo de solo lectura.

Drush config:import está siendo bloqueado

Las importaciones de configuración mediante Drush deberían funcionar automáticamente ya que el módulo detecta el bloqueo de ConfigImporter. Si está bloqueado, asegúrate de usar un comando estándar de importación de configuración (drush config:import o drush cim) y no código personalizado que omita el ConfigImporter.

Las actualizaciones de base de datos (update.php) están fallando

El módulo automáticamente permite actualizaciones de base de datos mediante la ruta system.db_update. Si las actualizaciones están bloqueadas, asegúrate de ejecutar las actualizaciones a través de los métodos estándar update.php o drush updatedb.

Necesito editar una configuración específica que está siendo bloqueada

Agrega el nombre de la configuración a la lista blanca en settings.php: $settings['config_readonly_whitelist_patterns'] = ['config.name.here']; Puedes usar comodines como 'block.block.*' para coincidir con múltiples configuraciones.

El informe de estado muestra 'Config Read-only module is enabled but not active'

Esta advertencia indica que el módulo está instalado pero $settings['config_readonly'] no está establecido a TRUE en settings.php. Agrega la configuración para activar la protección.

Security Notes 5
  • Este módulo está cubierto por la política de avisos de seguridad de Drupal
  • El modo solo CLI (verificación PHP_SAPI) se desaconseja ya que permite a cualquiera con acceso shell o Drush modificar la configuración
  • Los interruptores basados en archivos deben usar archivos fuera del webroot para prevenir manipulación basada en web
  • El módulo protege contra cambios en la interfaz pero no previene cambios de configuración mediante código personalizado o manipulación directa de la base de datos
  • Para máxima seguridad, combina con permisos de archivo adecuados en settings.php y restringe el acceso Drush/shell a servidores de producción