AEM componentes y plantillas forman un conjunto de herramientas muy potente. Los desarrolladores pueden utilizarlos para proporcionar a los usuarios comerciales, editores y administradores del sitio web la funcionalidad de adaptar sus sitios web a las cambiantes necesidades comerciales (agilidad del contenido), manteniendo al mismo tiempo el diseño uniforme de los sitios (protección de la marca).
Un desafío típico para una persona responsable de un sitio web, o conjunto de sitios web (por ejemplo, en una sucursal de una empresa global), es introducir un nuevo tipo de presentación de contenido en sus sitios web.
Supongamos que es necesario agregar una página de lista de noticias a los sitios web, que lista extractos de otros artículos ya publicados. La página debe tener el mismo diseño y estructura que el resto del sitio web.
La manera recomendada de abordar ese problema sería:
Esto ilustra cómo este enfoque permite a los usuarios y administradores contribuyentes del sitio web responder rápidamente a las necesidades comerciales, sin requerir la participación de equipos de desarrollo. Los métodos alternativos, como la creación de una nueva plantilla, suelen ser un ejercicio costoso que requiere un proceso de gestión del cambio y la participación del equipo de desarrollo. Esto hace que todo el proceso sea mucho más largo y costoso.
Por consiguiente, los desarrolladores de sistemas basados en AEM deben utilizar:
Las siguientes reglas generales para desarrolladores tienen sentido en la mayoría de los proyectos habituales:
Al crear sus propios componentes o personalizar un componente existente, suele ser más fácil (y seguro) reutilizar las definiciones existentes. Los mismos principios también se aplican a otros elementos dentro de AEM, por ejemplo el controlador de errores.
Esto se puede hacer copiando y superponiendo la definición existente. En otras palabras, copiando la definición de /libs
a /apps/<your-project>
. Esta nueva definición, en /apps
, puede actualizarse según sus necesidades.
Consulte Uso de Overlays para obtener más detalles.
Por ejemplo:
Personalización de un componente
Esto implicaba superponer una definición de componente:
Cree una nueva carpeta de componentes en /apps/<website-name>/components/<MyComponent>
copiando un componente existente:
Por ejemplo, para personalizar la copia del componente Texto:
/libs/foundation/components/text
/apps/myProject/components/text
Personalización de páginas mostradas por el controlador de errores
Este caso implica la superposición de un servlet:
En el repositorio, copie las secuencias de comandos predeterminadas:
/libs/sling/servlet/errorhandler/
/apps/sling/servlet/errorhandler/
no debe cambiar nada en la ruta /libs
.
Esto se debe a que el contenido de /libs
se sobrescribe la próxima vez que actualice la instancia (y bien puede sobrescribirse al aplicar una revisión o un paquete de funciones).
Para configuración y otros cambios:
/libs
a /apps
/apps
Las Consultas JCR son una poderosa herramienta cuando se utilizan correctamente. Son adecuadas para:
consultas reales del usuario final, como búsquedas de texto completo en contenido.
ocasiones en las que el contenido estructurado debe encontrarse en todo el repositorio.
En estos casos, asegúrese de que las consultas solo se ejecuten cuando sea absolutamente necesario, por ejemplo, en la activación de componentes o la invalidación de caché (a diferencia de, por ejemplo, los pasos de Flujos de trabajo, los controladores de Evento que déclencheur en modificaciones de contenido, Filtros, etc.).
Las Consultas JCR nunca deben utilizarse para solicitudes de procesamiento puras. Por ejemplo, las Consultas JCR no son apropiadas para
Para procesar contenido, utilice el acceso de navegación al árbol de contenido en lugar de realizar una Consulta JCR.
Si utiliza el Generador de Consultas, utilice Consultas JCR, ya que el Generador de Consultas genera Consultas JCR debajo del capó.
También vale la pena hacer referencia a la lista de comprobación de seguridad.
Debe utilizar la sesión de usuario, no la sesión administrativa. Esto significa que debe utilizar:
slingRequest.getResourceResolver().adaptTo(Session.class);
La secuencia de comandos entre sitios (XSS) permite a los atacantes insertar código en páginas web vistas por otros usuarios. Esta vulnerabilidad de seguridad puede ser aprovechada por usuarios web malintencionados para evitar controles de acceso.
AEM aplica el principio de filtrar todo el contenido proporcionado por el usuario durante la salida. La prevención de XSS recibe la máxima prioridad durante el desarrollo y las pruebas.
Además, un firewall de aplicaciones web, como mod_security para Apache, puede proporcionar un control central y confiable sobre la seguridad del entorno de implementación y protegerse contra ataques de scripts entre sitios no detectados anteriormente.
El código de ejemplo proporcionado con AEM puede no protegerse de dichos ataques y generalmente depende del filtrado de solicitudes por un servidor de seguridad de aplicaciones web.
La hoja de trucos de la API XSS contiene la información que necesita conocer para utilizar la API XSS y hacer que una aplicación AEM sea más segura. Puede descargarlo aquí:
La hoja de trucos XSSAPI.
En cuanto a cualquier aplicación de Internet, asegúrese de que al transportar información confidencial
Esto se aplica a la información que es confidencial para el sistema (como la configuración o el acceso administrativo) así como a la información confidencial para sus usuarios (como sus datos personales)
Las páginas de error se pueden personalizar para AEM. Esto es aconsejable para que la instancia no muestre los seguimientos de sling en los errores internos del servidor.
Consulte Personalización de páginas de error que muestra el controlador de errores para obtener más información.
Dado que AEM acceder a un gran número de archivos, se recomienda configurar explícitamente para AEM el número de archivos abiertos para un proceso de Java.
Para minimizar este problema, el desarrollo debe garantizar que cualquier archivo abierto se cierre correctamente tan pronto como sea posible (de manera significativa).