Cuando estamos configurando la seguridad dentro de Microsoft Dynamics AX 2012, como ya sabemos, podemos asociar uno o más roles a un usuario concreto. Para cada uno de estos roles, somos capaces de restringir los accesos a las empresas mediante la asignación de organizaciones.
Para asignar organizaciones, debemos acceder a Administración del Sistema / Común / Usuarios / Usuarios:
- Seleccionar el usuario al que queremos restringir el acceso a las compañías
- Clic en botón Editar o doble clic en el propio usuario
- Para cada uno de los roles asignados, clic en el botón Asignar organizaciones
- Marcar la opción Conceder acceso a organizaciones específicas de manera individual
- Ahora ya podemos seleccionar las empresas a las que queremos que tenga acceso y darle al botón Concesión (Si dejamos el Grid vacío, el usuario tendrá acceso a todas las empresas)
Ahora, el usuario únicamente tendrá permiso para acceder a las entidades legales seleccionadas, tal y como podéis ver en la siguiente imagen.
De esta forma, conseguimos que el usuario no pueda acceder a las empresas que no debería, pero, puesto que tiene el rol de contable, este usuario tendrá acceso al formulario de Entidades jurídicas en el que podrá ver y editar datos de empresas a las que no tiene acceso.
En el caso en el que nos encontramos, esta no sería una solución viable, puesto que se requiere que este usuario concreto no tenga visibilidad de ninguna de las empresas del grupo excepto de la que le hemos asignado, por lo que tenemos que buscar alguna solución complementaria a lo realizado hasta ahora.
¿Como solucionamos el problema con el que nos encontramos ahora mismo?
Pues la solución es bastante más sencilla de lo que podemos pensar a priori, puesto que somos capaces de restringir el listado de Entidades jurídicas basándonos en la configuración de seguridad de cada usuario con ayuda del framework Extensible Data Security (XDS). Para ello, necesitaremos crear una Política de Seguridad y una Query para limitar los registros. ¡Vamos a ello!
Lo primero que vamos a hacer es la Query que se encargará de limitar los registros visibles en la tabla de Entidades jurídicas (CompanyInfo). Para poder limitar estos registros, lo que haremos será añadir a la Query también la tabla MyLegalEntities, haciendo una relación entre ambas por el campo DataArea. Esta última tabla, contendrá, en tiempo de ejecución, los datos de las empresas asociados a la sesión y usuario actual basándose en la configuración que hicimos previamente (+info).
De esta forma, al hacer el join entre ambas tablas, ya tenemos limitado el número de registros que debe visualizar cada usuario. Ahora solo nos faltaría poder aplicar este filtro para los distintos usuarios. Para ello, necesitaremos crear una Política de Seguridad,
Una vez que creemos la política de seguridad desde el nodo Security / Policies dentro del AOT, rellenamos las propiedades tal y como se ven en la siguiente imagen, indicando el nombre y label de la política, así como la tabla principal, la query en la que se basa.
La propiedad ConstrainedTable la ponemos con el valor Yes para indicar que se deben restringir los registros que se devuelven de la tabla principal, y la propiedad Operation con el valor All operations para que esta política afecte a la Selección, Inserción, Actualización y Borrado de los datos en esta tabla.
Por último, nos quedaría habilitar la política de seguridad. Para ello, pondremos la propiedad Enabled a Yes y ya tendremos esta restricción activa para todos los usuarios, aunque siempre podemos limitar los roles a los que queremos que afecte desde las propiedades ContextType y ContextString.
Ahora, como veis en la imagen, el usuario solo tiene acceso a la empresa que tiene asociada:
Aunque, todavía no hemos terminado, puesto que si lo dejamos aquí, tendremos problemas cuando el usuario intente acceder a los formularios de Cuentas principales o Valores de la dimensión financiera, ya que dará un error puesto que son datos asociados a las entidades legales. Para evitar estos errores, únicamente tendremos que añadir nuevas tablas a la política de seguridad para poder restringir también los datos de estas. Estas tablas serán MainAccountLegalEntity, Ledger y DimensionAttrValueLedgerOverride, quedando la política de seguridad de la siguiente manera:
Y ahora sí, habremos terminado el proceso para limitar las empresas que puede ver un usuario concreto.
Saludos!
Hola Juanan
Una pregunta en el caso que quisiéramos denegar el acceso según la entidad legal, es decir tenemos un menu item en un menu y queremos que solo se pueda acceder a ese menu item si estamos en la empresa USMF por ejemplo, habría alguna forma de hacerlo?.
Saludos
Buenas David,
La opción que se me ocurre es jugar con la asignación de organizaciones dentro de los roles que tenga asignado el usuario.
Si vas a ver los detalles de usuario, puedes ponerte sobre un rol concreto e ir al botón «Asignar organizaciones», de este modo te permitirá aplicar un rol a un usuario en una o varias empresas.
Si haces un rol específico que tenga acceso al menú item que indicas, podrías asignar este rol a un usuario solo en aquellas empresas en las que quieres que tengas acceso.
Espero que te sirva 😉