Sensei Característica destacada: Ámbito de la biblioteca
Gestionar las dependencias con flexibilidad
La funcionalidad Scope de Sensei siempre ha sido una de las favoritas de los desarrolladores. Con la posibilidad de ampliar o limitar el alcance de la aplicación de una receta, los equipos de desarrollo han podido personalizar su uso para proyectos individuales y verticales dentro de sus organizaciones, lo que permite a los desarrolladores personalizar su experiencia.
Y, como es lógico, está en el centro de los procesos de innovación continua de Sensei. Durante una sesión de brainstorming de innovación sobre la ampliación del "alcance" (sí, un juego de palabras), surgió una pregunta:
"Estaba intentando crear una receta para ... pero desde la versión x, el framework ha dejado de lado la función. No estoy seguro de que siga siendo útil crear una receta. ¿Qué opinas?"
Por supuesto, no es la primera vez que dudamos en crear una receta. Aunque la receta podría considerarse como una información redundante, creemos que es valioso crear algo que sea aplicable a un número limitado de versiones de la dependencia en cuestión. Y por ello, creamos el ámbito de la Biblioteca.
El alcance de la biblioteca nos permite comprobar si una dependencia está presente en el proyecto y aplicar condicionalmente las recetas de Sensei . Esto proporciona una gran flexibilidad cuando los equipos navegan por el código heredado y las dependencias.
Muchos de ustedes deben conocer el ámbito de la Biblioteca que ya está disponible en la Configuración General. ¿Qué es esto? Hemos habilitado el ámbito de la biblioteca para que esté presente en YAML, al igual que la búsqueda. Esto crea una mejor experiencia para el usuario y no rompe el flujo al crear la receta, que de otra manera tendría que navegar a la Configuración General y volver a actualizar los metadatos. Más de estos ámbitos llegarán a YAML pero hemos empezado con el Ámbito de la Biblioteca.
Así que vamos a profundizar un poco más en su funcionamiento con un ejemplo.
Alcance de la biblioteca aplicado a hibernate-jpamodelgen
Imagina el siguiente caso:
Queremos crear una API REST de Spring Web que nos permita consultar algunos datos. De acuerdo con las mejores prácticas, creamos un modelo para la entidad que queremos consultar. A continuación, añadimos una dependencia a Hibernate ORM, para no tener que manipular la estructura de la base de datos. El ORM se encarga de eso por nosotros. También necesitamos crear un servicio que proporcione los datos de la capa de acceso a datos (repositorios CRUD y demás) al controlador. Por último, creamos la clase del controlador para nuestra API, donde expondremos las consultas permitidas como endpoints.
Para evitar tener que exponer diferentes endpoints para cada campo que pueda ser consultado, optamos por utilizar las especificaciones de JPA 2. Para ello, creamos una especificación en el controlador a partir de la URL de la petición. Esta especificación describe cómo deben ser las entidades que buscamos. En la propia clase `Specification`, implementamos el método `toPredicate` para indicar cómo se puede validar la especificación.
Pero nos encontramos con un problema en el método `toPredicate`. Para construir el predicado, necesitamos conocer los nombres de las columnas de la base de datos para comparar. Pero como estamos utilizando un ORM, no tenemos estas columnas presentes en un modelo separado. Por lo tanto, el generador de metamodelos de JPA 2 de Hibernate viene al rescate. Esto nos ayudará a generar un metamodelo para las entidades que le hemos pedido que maneje. Estos metamodelos nos permiten referenciar los nombres de las columnas como propiedades en lugar de codificarlos.
Creación de la receta Sensei
Ahora que tenemos los metamodelos generados, queremos darles un buen uso. Sensei puede ayudar a cualquier persona que trabaje en el proyecto recordándole que debe utilizar el metamodelo, asegurándose de que los nombres de las columnas no estén codificados en ninguna parte. Así que vamos a ponerlo en práctica.
Para empezar, echamos un vistazo al método `toPredicate`.

Este predicado básico sólo comparará el nombre de nuestra entidad. Podemos ampliarlo utilizando cláusulas `y`, pero para el propósito de esta receta, esta "simple" comprobación será suficiente.
Para el componente de búsqueda de la receta, queremos llamar al método `get()` del parámetro raíz, por lo que seleccionamos la opción `methodcall` del desplegable. A continuación, queremos limitar la búsqueda a una llamada al método con el nombre `get` cuya firma está declarada en la interfaz `Path` del paquete `javax.persistence.criteria`. Como el método ha sido sobrecargado, también necesitamos decirle a la búsqueda que nuestra receta sólo se aplica a la variante que toma una sola cadena como argumento. Para solucionar el problema de tener los nombres de las columnas en el código deberíamos utilizar un argumento de tipo `SingularAttribute` en su lugar, el mismo tipo que proporciona el generador del metamodelo.

La receta que hemos creado hasta ahora se activará en cualquier base de código que utilice la interfaz `Path` de JPA 2, independientemente de que la base de código esté configurada para utilizar el generador de modelos de Hibernate. Si esta librería está presente en el proyecto, queremos indicar al usuario que debe ser utilizada, por lo que añadimos un ámbito de librería a la receta.

Y finalmente, nuestra receta está lista.

Con esta receta, cualquier ocurrencia de `Path#get` que utilice un valor de cadena como argumento será marcada. Como puede ver en el código de ejemplo resaltado en la captura de pantalla anterior, esta receta sigue funcionando cuando el nombre literal del nombre de la columna se almacena en una variable intermedia.
Nota - También podemos invertir el ámbito de la biblioteca para manejar el caso de que la biblioteca no esté disponible, anteponiendo una cláusula `not` al ámbito.
Conclusión:
Como hemos visto en el ejemplo anterior, esta nueva característica nos permite crear recetas más útiles al aplicarlas en función de la presencia de dependencias en el proyecto. Para mejorar aún más su potencia, hemos incluido más opciones de las que se mostraban en el ejemplo, como por ejemplo no sólo comprobar si la dependencia está presente, sino también aplicar condiciones a la versión específica de la dependencia.
Los principales casos de uso que vemos para esta función son evitar que las recetas proporcionen información duplicada, detectar problemas relacionados con versiones específicas de dependencias, pero también realizar migraciones de una versión de dependencia a la siguiente. Estamos deseando que nos cuentes qué usos ves para esta función.
Como en el caso de todas las funciones de Sensei , en la documentación de referencia encontrará más información sobre el alcance de la biblioteca.
Nick es un investigador de seguridad dedicado en Secure Code Warrior, con experiencia tanto en ingeniería de software como en seguridad. Además de su pasión por la seguridad, tiene un Msc. Ir. en ciencias informáticas por la Universidad de Gante. Su misión es hacer que el software sea más seguro para todos nosotros.

Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.
Reservar una demostraciónNick es un investigador de seguridad dedicado en Secure Code Warrior, con experiencia tanto en ingeniería de software como en seguridad. Además de su pasión por la seguridad, tiene un Msc. Ir. en ciencias informáticas por la Universidad de Gante. Su misión es hacer que el software sea más seguro para todos nosotros.


Gestionar las dependencias con flexibilidad
La funcionalidad Scope de Sensei siempre ha sido una de las favoritas de los desarrolladores. Con la posibilidad de ampliar o limitar el alcance de la aplicación de una receta, los equipos de desarrollo han podido personalizar su uso para proyectos individuales y verticales dentro de sus organizaciones, lo que permite a los desarrolladores personalizar su experiencia.
Y, como es lógico, está en el centro de los procesos de innovación continua de Sensei. Durante una sesión de brainstorming de innovación sobre la ampliación del "alcance" (sí, un juego de palabras), surgió una pregunta:
"Estaba intentando crear una receta para ... pero desde la versión x, el framework ha dejado de lado la función. No estoy seguro de que siga siendo útil crear una receta. ¿Qué opinas?"
Por supuesto, no es la primera vez que dudamos en crear una receta. Aunque la receta podría considerarse como una información redundante, creemos que es valioso crear algo que sea aplicable a un número limitado de versiones de la dependencia en cuestión. Y por ello, creamos el ámbito de la Biblioteca.
El alcance de la biblioteca nos permite comprobar si una dependencia está presente en el proyecto y aplicar condicionalmente las recetas de Sensei . Esto proporciona una gran flexibilidad cuando los equipos navegan por el código heredado y las dependencias.
Muchos de ustedes deben conocer el ámbito de la Biblioteca que ya está disponible en la Configuración General. ¿Qué es esto? Hemos habilitado el ámbito de la biblioteca para que esté presente en YAML, al igual que la búsqueda. Esto crea una mejor experiencia para el usuario y no rompe el flujo al crear la receta, que de otra manera tendría que navegar a la Configuración General y volver a actualizar los metadatos. Más de estos ámbitos llegarán a YAML pero hemos empezado con el Ámbito de la Biblioteca.
Así que vamos a profundizar un poco más en su funcionamiento con un ejemplo.
Alcance de la biblioteca aplicado a hibernate-jpamodelgen
Imagina el siguiente caso:
Queremos crear una API REST de Spring Web que nos permita consultar algunos datos. De acuerdo con las mejores prácticas, creamos un modelo para la entidad que queremos consultar. A continuación, añadimos una dependencia a Hibernate ORM, para no tener que manipular la estructura de la base de datos. El ORM se encarga de eso por nosotros. También necesitamos crear un servicio que proporcione los datos de la capa de acceso a datos (repositorios CRUD y demás) al controlador. Por último, creamos la clase del controlador para nuestra API, donde expondremos las consultas permitidas como endpoints.
Para evitar tener que exponer diferentes endpoints para cada campo que pueda ser consultado, optamos por utilizar las especificaciones de JPA 2. Para ello, creamos una especificación en el controlador a partir de la URL de la petición. Esta especificación describe cómo deben ser las entidades que buscamos. En la propia clase `Specification`, implementamos el método `toPredicate` para indicar cómo se puede validar la especificación.
Pero nos encontramos con un problema en el método `toPredicate`. Para construir el predicado, necesitamos conocer los nombres de las columnas de la base de datos para comparar. Pero como estamos utilizando un ORM, no tenemos estas columnas presentes en un modelo separado. Por lo tanto, el generador de metamodelos de JPA 2 de Hibernate viene al rescate. Esto nos ayudará a generar un metamodelo para las entidades que le hemos pedido que maneje. Estos metamodelos nos permiten referenciar los nombres de las columnas como propiedades en lugar de codificarlos.
Creación de la receta Sensei
Ahora que tenemos los metamodelos generados, queremos darles un buen uso. Sensei puede ayudar a cualquier persona que trabaje en el proyecto recordándole que debe utilizar el metamodelo, asegurándose de que los nombres de las columnas no estén codificados en ninguna parte. Así que vamos a ponerlo en práctica.
Para empezar, echamos un vistazo al método `toPredicate`.

Este predicado básico sólo comparará el nombre de nuestra entidad. Podemos ampliarlo utilizando cláusulas `y`, pero para el propósito de esta receta, esta "simple" comprobación será suficiente.
Para el componente de búsqueda de la receta, queremos llamar al método `get()` del parámetro raíz, por lo que seleccionamos la opción `methodcall` del desplegable. A continuación, queremos limitar la búsqueda a una llamada al método con el nombre `get` cuya firma está declarada en la interfaz `Path` del paquete `javax.persistence.criteria`. Como el método ha sido sobrecargado, también necesitamos decirle a la búsqueda que nuestra receta sólo se aplica a la variante que toma una sola cadena como argumento. Para solucionar el problema de tener los nombres de las columnas en el código deberíamos utilizar un argumento de tipo `SingularAttribute` en su lugar, el mismo tipo que proporciona el generador del metamodelo.

La receta que hemos creado hasta ahora se activará en cualquier base de código que utilice la interfaz `Path` de JPA 2, independientemente de que la base de código esté configurada para utilizar el generador de modelos de Hibernate. Si esta librería está presente en el proyecto, queremos indicar al usuario que debe ser utilizada, por lo que añadimos un ámbito de librería a la receta.

Y finalmente, nuestra receta está lista.

Con esta receta, cualquier ocurrencia de `Path#get` que utilice un valor de cadena como argumento será marcada. Como puede ver en el código de ejemplo resaltado en la captura de pantalla anterior, esta receta sigue funcionando cuando el nombre literal del nombre de la columna se almacena en una variable intermedia.
Nota - También podemos invertir el ámbito de la biblioteca para manejar el caso de que la biblioteca no esté disponible, anteponiendo una cláusula `not` al ámbito.
Conclusión:
Como hemos visto en el ejemplo anterior, esta nueva característica nos permite crear recetas más útiles al aplicarlas en función de la presencia de dependencias en el proyecto. Para mejorar aún más su potencia, hemos incluido más opciones de las que se mostraban en el ejemplo, como por ejemplo no sólo comprobar si la dependencia está presente, sino también aplicar condiciones a la versión específica de la dependencia.
Los principales casos de uso que vemos para esta función son evitar que las recetas proporcionen información duplicada, detectar problemas relacionados con versiones específicas de dependencias, pero también realizar migraciones de una versión de dependencia a la siguiente. Estamos deseando que nos cuentes qué usos ves para esta función.
Como en el caso de todas las funciones de Sensei , en la documentación de referencia encontrará más información sobre el alcance de la biblioteca.

Gestionar las dependencias con flexibilidad
La funcionalidad Scope de Sensei siempre ha sido una de las favoritas de los desarrolladores. Con la posibilidad de ampliar o limitar el alcance de la aplicación de una receta, los equipos de desarrollo han podido personalizar su uso para proyectos individuales y verticales dentro de sus organizaciones, lo que permite a los desarrolladores personalizar su experiencia.
Y, como es lógico, está en el centro de los procesos de innovación continua de Sensei. Durante una sesión de brainstorming de innovación sobre la ampliación del "alcance" (sí, un juego de palabras), surgió una pregunta:
"Estaba intentando crear una receta para ... pero desde la versión x, el framework ha dejado de lado la función. No estoy seguro de que siga siendo útil crear una receta. ¿Qué opinas?"
Por supuesto, no es la primera vez que dudamos en crear una receta. Aunque la receta podría considerarse como una información redundante, creemos que es valioso crear algo que sea aplicable a un número limitado de versiones de la dependencia en cuestión. Y por ello, creamos el ámbito de la Biblioteca.
El alcance de la biblioteca nos permite comprobar si una dependencia está presente en el proyecto y aplicar condicionalmente las recetas de Sensei . Esto proporciona una gran flexibilidad cuando los equipos navegan por el código heredado y las dependencias.
Muchos de ustedes deben conocer el ámbito de la Biblioteca que ya está disponible en la Configuración General. ¿Qué es esto? Hemos habilitado el ámbito de la biblioteca para que esté presente en YAML, al igual que la búsqueda. Esto crea una mejor experiencia para el usuario y no rompe el flujo al crear la receta, que de otra manera tendría que navegar a la Configuración General y volver a actualizar los metadatos. Más de estos ámbitos llegarán a YAML pero hemos empezado con el Ámbito de la Biblioteca.
Así que vamos a profundizar un poco más en su funcionamiento con un ejemplo.
Alcance de la biblioteca aplicado a hibernate-jpamodelgen
Imagina el siguiente caso:
Queremos crear una API REST de Spring Web que nos permita consultar algunos datos. De acuerdo con las mejores prácticas, creamos un modelo para la entidad que queremos consultar. A continuación, añadimos una dependencia a Hibernate ORM, para no tener que manipular la estructura de la base de datos. El ORM se encarga de eso por nosotros. También necesitamos crear un servicio que proporcione los datos de la capa de acceso a datos (repositorios CRUD y demás) al controlador. Por último, creamos la clase del controlador para nuestra API, donde expondremos las consultas permitidas como endpoints.
Para evitar tener que exponer diferentes endpoints para cada campo que pueda ser consultado, optamos por utilizar las especificaciones de JPA 2. Para ello, creamos una especificación en el controlador a partir de la URL de la petición. Esta especificación describe cómo deben ser las entidades que buscamos. En la propia clase `Specification`, implementamos el método `toPredicate` para indicar cómo se puede validar la especificación.
Pero nos encontramos con un problema en el método `toPredicate`. Para construir el predicado, necesitamos conocer los nombres de las columnas de la base de datos para comparar. Pero como estamos utilizando un ORM, no tenemos estas columnas presentes en un modelo separado. Por lo tanto, el generador de metamodelos de JPA 2 de Hibernate viene al rescate. Esto nos ayudará a generar un metamodelo para las entidades que le hemos pedido que maneje. Estos metamodelos nos permiten referenciar los nombres de las columnas como propiedades en lugar de codificarlos.
Creación de la receta Sensei
Ahora que tenemos los metamodelos generados, queremos darles un buen uso. Sensei puede ayudar a cualquier persona que trabaje en el proyecto recordándole que debe utilizar el metamodelo, asegurándose de que los nombres de las columnas no estén codificados en ninguna parte. Así que vamos a ponerlo en práctica.
Para empezar, echamos un vistazo al método `toPredicate`.

Este predicado básico sólo comparará el nombre de nuestra entidad. Podemos ampliarlo utilizando cláusulas `y`, pero para el propósito de esta receta, esta "simple" comprobación será suficiente.
Para el componente de búsqueda de la receta, queremos llamar al método `get()` del parámetro raíz, por lo que seleccionamos la opción `methodcall` del desplegable. A continuación, queremos limitar la búsqueda a una llamada al método con el nombre `get` cuya firma está declarada en la interfaz `Path` del paquete `javax.persistence.criteria`. Como el método ha sido sobrecargado, también necesitamos decirle a la búsqueda que nuestra receta sólo se aplica a la variante que toma una sola cadena como argumento. Para solucionar el problema de tener los nombres de las columnas en el código deberíamos utilizar un argumento de tipo `SingularAttribute` en su lugar, el mismo tipo que proporciona el generador del metamodelo.

La receta que hemos creado hasta ahora se activará en cualquier base de código que utilice la interfaz `Path` de JPA 2, independientemente de que la base de código esté configurada para utilizar el generador de modelos de Hibernate. Si esta librería está presente en el proyecto, queremos indicar al usuario que debe ser utilizada, por lo que añadimos un ámbito de librería a la receta.

Y finalmente, nuestra receta está lista.

Con esta receta, cualquier ocurrencia de `Path#get` que utilice un valor de cadena como argumento será marcada. Como puede ver en el código de ejemplo resaltado en la captura de pantalla anterior, esta receta sigue funcionando cuando el nombre literal del nombre de la columna se almacena en una variable intermedia.
Nota - También podemos invertir el ámbito de la biblioteca para manejar el caso de que la biblioteca no esté disponible, anteponiendo una cláusula `not` al ámbito.
Conclusión:
Como hemos visto en el ejemplo anterior, esta nueva característica nos permite crear recetas más útiles al aplicarlas en función de la presencia de dependencias en el proyecto. Para mejorar aún más su potencia, hemos incluido más opciones de las que se mostraban en el ejemplo, como por ejemplo no sólo comprobar si la dependencia está presente, sino también aplicar condiciones a la versión específica de la dependencia.
Los principales casos de uso que vemos para esta función son evitar que las recetas proporcionen información duplicada, detectar problemas relacionados con versiones específicas de dependencias, pero también realizar migraciones de una versión de dependencia a la siguiente. Estamos deseando que nos cuentes qué usos ves para esta función.
Como en el caso de todas las funciones de Sensei , en la documentación de referencia encontrará más información sobre el alcance de la biblioteca.

Haga clic en el siguiente enlace y descargue el PDF de este recurso.
Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.
Ver el informeReservar una demostraciónNick es un investigador de seguridad dedicado en Secure Code Warrior, con experiencia tanto en ingeniería de software como en seguridad. Además de su pasión por la seguridad, tiene un Msc. Ir. en ciencias informáticas por la Universidad de Gante. Su misión es hacer que el software sea más seguro para todos nosotros.
Gestionar las dependencias con flexibilidad
La funcionalidad Scope de Sensei siempre ha sido una de las favoritas de los desarrolladores. Con la posibilidad de ampliar o limitar el alcance de la aplicación de una receta, los equipos de desarrollo han podido personalizar su uso para proyectos individuales y verticales dentro de sus organizaciones, lo que permite a los desarrolladores personalizar su experiencia.
Y, como es lógico, está en el centro de los procesos de innovación continua de Sensei. Durante una sesión de brainstorming de innovación sobre la ampliación del "alcance" (sí, un juego de palabras), surgió una pregunta:
"Estaba intentando crear una receta para ... pero desde la versión x, el framework ha dejado de lado la función. No estoy seguro de que siga siendo útil crear una receta. ¿Qué opinas?"
Por supuesto, no es la primera vez que dudamos en crear una receta. Aunque la receta podría considerarse como una información redundante, creemos que es valioso crear algo que sea aplicable a un número limitado de versiones de la dependencia en cuestión. Y por ello, creamos el ámbito de la Biblioteca.
El alcance de la biblioteca nos permite comprobar si una dependencia está presente en el proyecto y aplicar condicionalmente las recetas de Sensei . Esto proporciona una gran flexibilidad cuando los equipos navegan por el código heredado y las dependencias.
Muchos de ustedes deben conocer el ámbito de la Biblioteca que ya está disponible en la Configuración General. ¿Qué es esto? Hemos habilitado el ámbito de la biblioteca para que esté presente en YAML, al igual que la búsqueda. Esto crea una mejor experiencia para el usuario y no rompe el flujo al crear la receta, que de otra manera tendría que navegar a la Configuración General y volver a actualizar los metadatos. Más de estos ámbitos llegarán a YAML pero hemos empezado con el Ámbito de la Biblioteca.
Así que vamos a profundizar un poco más en su funcionamiento con un ejemplo.
Alcance de la biblioteca aplicado a hibernate-jpamodelgen
Imagina el siguiente caso:
Queremos crear una API REST de Spring Web que nos permita consultar algunos datos. De acuerdo con las mejores prácticas, creamos un modelo para la entidad que queremos consultar. A continuación, añadimos una dependencia a Hibernate ORM, para no tener que manipular la estructura de la base de datos. El ORM se encarga de eso por nosotros. También necesitamos crear un servicio que proporcione los datos de la capa de acceso a datos (repositorios CRUD y demás) al controlador. Por último, creamos la clase del controlador para nuestra API, donde expondremos las consultas permitidas como endpoints.
Para evitar tener que exponer diferentes endpoints para cada campo que pueda ser consultado, optamos por utilizar las especificaciones de JPA 2. Para ello, creamos una especificación en el controlador a partir de la URL de la petición. Esta especificación describe cómo deben ser las entidades que buscamos. En la propia clase `Specification`, implementamos el método `toPredicate` para indicar cómo se puede validar la especificación.
Pero nos encontramos con un problema en el método `toPredicate`. Para construir el predicado, necesitamos conocer los nombres de las columnas de la base de datos para comparar. Pero como estamos utilizando un ORM, no tenemos estas columnas presentes en un modelo separado. Por lo tanto, el generador de metamodelos de JPA 2 de Hibernate viene al rescate. Esto nos ayudará a generar un metamodelo para las entidades que le hemos pedido que maneje. Estos metamodelos nos permiten referenciar los nombres de las columnas como propiedades en lugar de codificarlos.
Creación de la receta Sensei
Ahora que tenemos los metamodelos generados, queremos darles un buen uso. Sensei puede ayudar a cualquier persona que trabaje en el proyecto recordándole que debe utilizar el metamodelo, asegurándose de que los nombres de las columnas no estén codificados en ninguna parte. Así que vamos a ponerlo en práctica.
Para empezar, echamos un vistazo al método `toPredicate`.

Este predicado básico sólo comparará el nombre de nuestra entidad. Podemos ampliarlo utilizando cláusulas `y`, pero para el propósito de esta receta, esta "simple" comprobación será suficiente.
Para el componente de búsqueda de la receta, queremos llamar al método `get()` del parámetro raíz, por lo que seleccionamos la opción `methodcall` del desplegable. A continuación, queremos limitar la búsqueda a una llamada al método con el nombre `get` cuya firma está declarada en la interfaz `Path` del paquete `javax.persistence.criteria`. Como el método ha sido sobrecargado, también necesitamos decirle a la búsqueda que nuestra receta sólo se aplica a la variante que toma una sola cadena como argumento. Para solucionar el problema de tener los nombres de las columnas en el código deberíamos utilizar un argumento de tipo `SingularAttribute` en su lugar, el mismo tipo que proporciona el generador del metamodelo.

La receta que hemos creado hasta ahora se activará en cualquier base de código que utilice la interfaz `Path` de JPA 2, independientemente de que la base de código esté configurada para utilizar el generador de modelos de Hibernate. Si esta librería está presente en el proyecto, queremos indicar al usuario que debe ser utilizada, por lo que añadimos un ámbito de librería a la receta.

Y finalmente, nuestra receta está lista.

Con esta receta, cualquier ocurrencia de `Path#get` que utilice un valor de cadena como argumento será marcada. Como puede ver en el código de ejemplo resaltado en la captura de pantalla anterior, esta receta sigue funcionando cuando el nombre literal del nombre de la columna se almacena en una variable intermedia.
Nota - También podemos invertir el ámbito de la biblioteca para manejar el caso de que la biblioteca no esté disponible, anteponiendo una cláusula `not` al ámbito.
Conclusión:
Como hemos visto en el ejemplo anterior, esta nueva característica nos permite crear recetas más útiles al aplicarlas en función de la presencia de dependencias en el proyecto. Para mejorar aún más su potencia, hemos incluido más opciones de las que se mostraban en el ejemplo, como por ejemplo no sólo comprobar si la dependencia está presente, sino también aplicar condiciones a la versión específica de la dependencia.
Los principales casos de uso que vemos para esta función son evitar que las recetas proporcionen información duplicada, detectar problemas relacionados con versiones específicas de dependencias, pero también realizar migraciones de una versión de dependencia a la siguiente. Estamos deseando que nos cuentes qué usos ves para esta función.
Como en el caso de todas las funciones de Sensei , en la documentación de referencia encontrará más información sobre el alcance de la biblioteca.
Índice
Nick es un investigador de seguridad dedicado en Secure Code Warrior, con experiencia tanto en ingeniería de software como en seguridad. Además de su pasión por la seguridad, tiene un Msc. Ir. en ciencias informáticas por la Universidad de Gante. Su misión es hacer que el software sea más seguro para todos nosotros.

Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.
Reservar una demostraciónDescargarRecursos para empezar
Panorama de la gestión de riesgos de los promotores
La gestión de riesgos del desarrollador es un enfoque holístico y proactivo de la seguridad de las aplicaciones, centrado en quienes contribuyen al código y no en los bits y bytes de la propia capa de la aplicación.
Seguridad desde el diseño: Definición de las mejores prácticas, capacitación de los desarrolladores y evaluación comparativa de los resultados de la seguridad preventiva
En este documento de investigación, los cofundadores Secure Code Warrior , Pieter Danhieux y el Dr. Matias Madou, Ph.D., junto con los expertos colaboradores, Chris Inglis, ex Director Nacional Cibernético de EE.UU. (ahora Asesor Estratégico de Paladin Capital Group), y Devin Lynch, Director Senior, Paladin Global Institute, revelarán los hallazgos clave de más de veinte entrevistas en profundidad con líderes de seguridad empresarial, incluyendo CISOs, un VP de Seguridad de Aplicaciones y profesionales de seguridad de software.
Evaluación comparativa de las competencias en materia de seguridad: optimización del diseño seguro en la empresa
Encontrar datos significativos sobre el éxito de las iniciativas Secure-by-Design es notoriamente difícil. Los responsables de la seguridad de la información se enfrentan a menudo al reto de demostrar el rendimiento de la inversión (ROI) y el valor empresarial de las actividades de los programas de seguridad, tanto a nivel de las personas como de la empresa. Por no mencionar que a las empresas les resulta especialmente difícil obtener información sobre cómo se comparan sus organizaciones con los estándares actuales del sector. La Estrategia Nacional de Ciberseguridad del Presidente desafió a las partes interesadas a "adoptar la seguridad y la resiliencia desde el diseño". La clave para que las iniciativas de seguridad por diseño funcionen no es sólo dotar a los desarrolladores de las habilidades necesarias para garantizar un código seguro, sino también garantizar a los reguladores que esas habilidades están en su lugar. En esta presentación, compartimos una miríada de datos cualitativos y cuantitativos, derivados de múltiples fuentes primarias, incluidos puntos de datos internos recogidos de más de 250.000 desarrolladores, opiniones de clientes basadas en datos y estudios públicos. Aprovechando esta agregación de puntos de datos, pretendemos comunicar una visión del estado actual de las iniciativas Secure-by-Design en múltiples verticales. El informe detalla por qué este espacio está actualmente infrautilizado, el impacto significativo que un programa de mejora de las competencias puede tener en la mitigación de los riesgos de ciberseguridad y el potencial para eliminar categorías de vulnerabilidades de un código base.
Servicios profesionales - Acelerar con experiencia
El equipo de servicios de estrategia de programas (PSS) de Secure Code Warriorle ayuda a crear, mejorar y optimizar su programa de codificación segura. Tanto si empieza de cero como si está perfeccionando su enfoque, nuestros expertos le proporcionarán orientación personalizada.
Recursos para empezar
Revelado: Cómo define el sector cibernético la seguridad por diseño
En nuestro último libro blanco, nuestros cofundadores, Pieter Danhieux y el doctor Matias Madou, se sentaron con más de veinte líderes de seguridad empresarial, incluidos CISO, líderes de AppSec y profesionales de la seguridad, para averiguar las piezas clave de este rompecabezas y descubrir la realidad detrás del movimiento Secure by Design. Se trata de una ambición compartida por todos los equipos de seguridad, pero no de un libro de jugadas compartido.
¿Vibe Coding va a convertir tu código en una fiesta de fraternidad?
Vibe Coding es como una fiesta de fraternidad universitaria, y la IA es la pieza central de todos los festejos, el barril. Es muy divertido dar rienda suelta a la creatividad y ver adónde te lleva tu imaginación, pero después de unas cuantas borracheras, beber (o usar IA) con moderación es, sin duda, la solución más segura a largo plazo.