Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Mire, no hay vuelta de hoja: los conjuntos de permisos no son tan emocionantes. Nadie salta de la cama el lunes con ganas de construir un conjunto de permisos. Entonces, ¿por qué escribir una publicación sobre conjuntos de permisos y grupos de conjuntos de permisos? ¡Porque los grupos de conjuntos de permisos ahora son mucho más útiles! Hemos hecho que las asignaciones de grupos de conjuntos de permisos sean recalculables en las pruebas unitarias. Siga leyendo para saber por qué eso es increíble.

Resumen rápido: ¿Qué es un grupo de conjuntos de permisos?

Muy bien, resumen rápido. Un conjunto de permisos es una colección de configuraciones y permisos que brindan a los usuarios acceso a varias herramientas y funciones. Los conjuntos de permisos amplían el acceso funcional de los usuarios sin cambiar sus perfiles. De hecho, incluso puede reemplazar en gran medida el uso de perfiles combinando el perfil de acceso mínimo estándar con conjuntos de permisos. Estos conjuntos de permisos se asignan luego a los usuarios seleccionados.

Los conjuntos de permisos son un poco como clases; deben centrarse en una sola área de responsabilidad. Por ejemplo, echemos un vistazo a los usuarios que están asignados al grupo Pronóstico de ingresos. Puede crear un conjunto de permisos que les otorgue acceso de lectura a los campos Ingresos en todas las oportunidades. Debido a que este permiso solo lo necesitan los pronosticadores de ingresos, no querrá combinar esos permisos con el resto de los permisos para el grupo Oportunidades.

Esto conduce inevitablemente a muchos conjuntos de permisos en su organización. ¡Es probable que cualquier usuario determinado deba ser asignado a una serie de conjuntos de permisos! Esto puede ser un poco como un festival administrativo de hacer clic, esperar, hacer clic y esperar, por lo que Salesforce introdujo Grupos de conjuntos de permisos. Como su nombre lo indica, un grupo de conjuntos de permisos es una colección de conjuntos de permisos que se pueden asignar todos a la vez. Una forma de pensar en cómo funcionan los grupos de conjuntos de permisos es la analogía de una persona. Primero crea conjuntos de permisos individuales para una tarea de trabajo determinada, como actualizar la información de contacto. Luego, establece un grupo de conjunto de permisos de estas tareas de trabajo individuales para definir la persona, como "Ejecutivo de cuenta".

Este diagrama de Venn muestra la relación entre conjuntos de permisos y grupos de conjuntos de permisos. Los segmentos de círculo rojo, amarillo y azul hacen referencia a conjuntos de permisos individuales; en este caso, conjuntos de permisos para acceder a los programas de Cuenta, Oportunidad e Ingresos. Los segmentos gris, morado y verde representan grupos de conjuntos de permisos, o personas, que se definen como la unión de esos conjuntos de permisos. Tenga en cuenta que el segmento naranja no representa una persona existente; en este ejemplo, nadie necesita acceder a los cronogramas de Cuentas e Ingresos sin tener también acceso a Oportunidades.

El problema

Los grupos de conjuntos de permisos han existido durante algunos lanzamientos, pero hasta ahora, han tenido un pequeño problema. Los desarrolladores que escriben pruebas unitarias que usan grupos de conjuntos de permisos podrían asignarlas a un usuario para que las pruebe. Desafortunadamente, esas pruebas fallarían como si nunca se hubiera realizado la asignación del grupo del conjunto de permisos. Esto, por supuesto, es… subóptimo. Si no puede probarlo en su código, es difícil recomendarlos para su adopción en su organización.

 @isTest clase pública PSGFAIL { @isTest prueba de vacío estáticoEstoFallaTristemente() { // obtener el PSG por nombre (puede haber sido modificado en la implementación) PermissionSetGroup psg = [SELECCIONE Id, Estado DESDE PermissionSetGroup WHERE DeveloperName='Vendedor' ]; // Cree un TestUser, utilizando el método auxiliar de Recetas de Apex Usuario testUser = TestFactory.createMinAccessUser(true); // asignar PSG al usuario actual (esto falla si PSG está desactualizado) inserte un nuevo PermissionSetAssignment (PermissionSetGroupId = psg.Id, AssigneeId = UserInfo.getUserId()); Booleano tieneAcceso = falso; System.runAs(usuarioprueba){ // Esto usa la biblioteca CanTheUser de Apex Recipes tieneAcceso = CanTheUser . flsAccessible ( 'Account' , 'TradeStyle' ); } /** * Sadly this assertion fails prior to Spring '22! */ System.assert(hasAccess, 'Expected a min-access profile with the Sales Persona PSG to have access to tradeStyle'); } }

La solución

El cerebro de Cheryl Feldman, Chris Peterson, Daniel Ballinger y su equipo de ingenieros vieron este problema y, en Spring '22, nos brindaron una solución en forma de un nuevo método en el espacio de nombres Test. Dado un ID de grupo de conjunto de permisos, Test.calculatePermissionSetGroup(psg.Id); vuelve a calcular los permisos para ese grupo de conjuntos de permisos, por lo que se aplican correctamente cuando se asignan. En combinación con el campo Estado del registro del grupo del conjunto de permisos, puede optimizar sus pruebas para activar el recálculo solo cuando sea necesario. Veamos cómo arreglar nuestra prueba unitaria anterior con una llamada para volver a calcular el grupo de conjuntos de permisos.

 @isTest clase pública PSG { @isTest prueba de vacío estáticoRecalcularPSG() { // obtener el PSG por nombre (puede haber sido modificado en la implementación) PermissionSetGroup psg = [SELECCIONE Id, Estado DESDE PermissionSetGroup WHERE DeveloperName='Vendedor' ]; // forzar calculo del PSG si no esta ya Actualizado if (psg.Estado != 'Actualizado') { Test.calculatePermissionSetGroup(psg.Id); } // Cree un TestUser, utilizando el método auxiliar de Recetas de Apex Usuario testUser = TestFactory.createMinAccessUser(true); // asignar PSG al usuario actual (esto falla si PSG está desactualizado) inserte un nuevo PermissionSetAssignment (PermissionSetGroupId = psg.Id, AssigneeId = UserInfo.getUserId()); Booleano tieneAcceso = falso; System.runAs(usuarioprueba){ // Esto usa la biblioteca CanTheUser de Apex Recipes tieneAcceso = CanTheUser . flsAccessible ( 'Account' , 'TradeStyle' ); }  /** * Success with Spring '22! */ System . assert ( hasAccess , 'Expected a min-access profile with the Sales Persona PSG to have access to tradeStyle' ); } }

Dado que volver a calcular el grupo de conjuntos de permisos puede llevar un segundo, se recomienda verificar el campo de estado antes de realizar la llamada para calcular.

¡Incluso puede crear e insertar nuevos registros de grupos de conjuntos de permisos dentro de sus pruebas unitarias! Echa un vistazo a este fragmento:

 // crear un PS con un permiso de usuario habilitado
PermissionSet ps = new PermissionSet(Name='apexPS', Label='apexPS');
ps.PermissionsIsSsoEnabled = verdadero;
insertar pd; // crea un PSG y agrega PS como componente
PermissionSetGroup psg = new PermissionSetGroup(DeveloperName='apexPSG', MasterLabel='apexPSG');
insertar psg; // agregar el PS al PSG
inserte un nuevo PermissionSetGroupComponent (PermissionSetGroupId = psg.Id, PermissionSetId = ps.Id); // fuerza el cálculo sincrónico
Test.calculatePermissionSetGroup(psg.Id); // asignar PSG a un usuario (esto fallaría si PSG no se calculó previamente)
inserte un nuevo PermissionSetAssignment (PermissionSetGroupId = psg.Id, AssigneeId = UserInfo.getUserId());

¿Qué hago con esto?

Tengo que admitir que los conjuntos de permisos y los grupos de conjuntos de permisos no son el tema más interesante. Pero son cruciales para asegurar el desarrollo de software en la Plataforma Salesforce. Pero no basta con usar conjuntos de permisos y grupos de conjuntos de permisos. Debe saber que su código respeta estos conjuntos de permisos y cómo reacciona cuando falla por un acceso insuficiente (o si falla en absoluto). De lo contrario, acabas de codificarte un buen agujero de seguridad.

Del mismo modo, ayude a sus compañeros de equipo administradores asegurándose de que cuando su código falle, al menos le diga qué permiso falta. La forma más fácil de hacer esto es escribir pruebas unitarias, y eso significa escribir pruebas que asignan diferentes grupos de conjuntos de permisos. Recuerde que sus pruebas también contribuyen a las pruebas de Hammer , lo que ayuda a garantizar que la plataforma no introduzca cambios importantes.

¡Pero espera! Hay más. Los conjuntos de permisos y los grupos de conjuntos de permisos están mejorando aún más. Con Spring '22, hay dos funciones nuevas en Beta: caducidad automática de las asignaciones de grupos de conjuntos de permisos y creación de políticas de seguridad de transacciones ampliadas para eventos de conjuntos de permisos . Tengo muchas ganas de ver cómo las organizaciones usan las asignaciones de grupos de conjuntos de permisos que expiran automáticamente.

Aprende MOAR esta semana

Los Gerentes de Producto y Relaciones con Desarrolladores están de vuelta para compartir las características y funcionalidades más recientes para ayudarlo a desarrollarse más rápido con nuevo contenido de Relaciones con Desarrolladores que cubre sus nuevas funciones favoritas. Asegúrese de ver Release Readiness Live el viernes 4 de febrero a las 9:00 PST. Por último, ¡esté atento al blog de desarrolladores de Salesforce para obtener más publicaciones sobre Spring '22!

Para obtener aún más información, consulta el trailmix de Spring '22 .

Sobre el Autor

public with sharing KevinPoorman {
public static String pronouns = 'he/him';
public static Double startedWithSalesforceAtApiLevel = 11.0;
public static String[] interests = ['Apex', 'Testing', 'iOS SDK', 'Generics', 'Metaprogramming'];
public static String funFact = 'Has two daughters he's training to take over the world.';
public static String twitterHandle = '@Codefriar';
}

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2022/02/learn-moar-in-spring-22-with-permission-set-groups.html

Entradas recomendadas