# Seguridad de Mondrian

{% hint style="warning" %}

#### Taller - Seguridad de Mondrian

Publicar cubos OLAP para uso organizacional requiere más que crear modelos dimensionales sofisticados: debes asegurar que los usuarios solo accedan a los datos apropiados según sus roles y responsabilidades. Mientras la seguridad de bases de datos relacionales puede restringir el acceso a nivel de tablas, la seguridad OLAP debe operar en múltiples granularidades: esquemas completos, cubos específicos, dimensiones e jerarquías individuales e incluso miembros particulares dentro de esas jerarquías. El marco de control de acceso por roles (RBAC) de Mondrian proporciona mecanismos de seguridad integrales que te permiten implementar políticas de protección de datos precisas y multinivel directamente dentro de las definiciones de tu esquema.

En este taller práctico y completo, implementarás seguridad de nivel empresarial para el esquema Miniature Models creando cuatro roles distintos con patrones de acceso progresivamente más restrictivos. Configurarás mapeadores de roles para enlazar los roles de la plataforma Pentaho con los roles del esquema de Mondrian, y luego aplicarás sistemáticamente restricciones de seguridad SchemaGrant, CubeGrant, HierarchyGrant y MemberGrant que controlan exactamente a qué datos puede acceder cada rol. Además, explorarás las políticas de rollup—una característica sofisticada que determina cómo se comportan los totales agregados cuando los usuarios tienen acceso restringido a miembros detallados subyacentes—asegurando que la seguridad no exponga inadvertidamente información restringida a través de valores agregados.

**Lo que lograrás:**

* Crear usuarios de la plataforma (exec\_user, sales\_mgr, region\_mgr, analyst) y asignar permisos en Pentaho
* Configurar el mapeador de roles Lookup Map en pentahoObjects.spring.xml para conectar los roles de la plataforma con los roles de Mondrian
* Implementar SchemaGrant con acceso "all" para el Rol Ejecutivo proporcionando acceso irrestricto al esquema
* Implementar SchemaGrant con acceso "none" más CubeGrant para el Rol de Gerente de Ventas restringiendo a cubos específicos
* Agregar niveles (State, City) a la jerarquía de la dimensión CUSTOMERS para pruebas de seguridad granulares
* Implementar HierarchyGrant con restricciones topLevel y bottomLevel para el Rol de Analista limitando la profundidad de navegación
* Crear seguridad MemberGrant para el Rol de Gerente Regional restringiendo el acceso a estados específicos (NJ, NY, PA)
* Comprender la herencia de seguridad y cómo otorgar acceso a un hijo implica implícitamente otorgar acceso al padre
* Configurar políticas de rollup (full, partial, hidden) para controlar el comportamiento de los agregados con acceso restringido
* Probar y validar cada configuración de seguridad iniciando sesión como diferentes usuarios
* Actualizar la caché del esquema de Mondrian para aplicar los cambios de seguridad

Al final de este taller, comprenderás cómo el modelo de seguridad jerárquico de Mondrian permite una protección de datos precisa y mantenible que refleja la estructura y responsabilidades organizacionales. En lugar de crear vistas o cubos separados para diferentes grupos de usuarios—un enfoque que duplica datos y crea pesadillas de mantenimiento—implementarás control de acceso por roles que mantiene una única fuente de verdad mientras presenta datos filtrados apropiadamente según las credenciales del usuario. Verás cómo los ejecutivos ven datos empresariales completos, los gerentes de ventas acceden a cubos departamentales, los gerentes regionales solo ven sus territorios y los analistas trabajan con datos resumidos sin detalles a nivel cliente—todo desde el mismo esquema subyacente asegurado mediante configuración XML declarativa en lugar de código de seguridad complejo a nivel de aplicación.

**Prerrequisitos:** Finalización del taller Miniature Models; Schema Workbench y Pentaho Server instalados con acceso administrativo; Comprensión de jerarquías de dimensiones y navegación de miembros; Familiaridad con la edición de XML y la gestión de usuarios en Pentaho

**Tiempo estimado:** 120 minutos
{% endhint %}

{% code expandable="true" %}

```xml
<Schema name="Miniature Models">
  <Cube name="Sales_FY2003_2005" visible="true" cache="true" enabled="true">
    <Table name="ORDERFACT" schema="PUBLIC">
    </Table>
    <Dimension type="StandardDimension" visible="true" foreignKey="CUSTOMERNUMBER" highCardinality="false" name="CUSTOMERS">
      <Hierarchy name="Customers" visible="true" hasAll="true" allMemberName="All Customers" primaryKey="CUSTOMERNUMBER">
        <Table name="CUSTOMER_W_TER" schema="PUBLIC">
        </Table>
        <Level name="Territory" visible="true" column="TERRITORY" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="Country" visible="true" column="COUNTRY" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="State" visible="true" table="CUSTOMER_W_TER" column="STATE" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="City" visible="true" table="CUSTOMER_W_TER" column="CITY" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="Customer Name" visible="true" column="CUSTOMERNAME" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" foreignKey="PRODUCTCODE" highCardinality="false" name="PRODUCTS">
      <Hierarchy name="Products" visible="true" hasAll="true" allMemberName="All Products" primaryKey="PRODUCTCODE">
        <Table name="PRODUCTS" schema="PUBLIC">
        </Table>
        <Level name="Line" visible="true" column="PRODUCTLINE" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="Vendor" visible="true" column="PRODUCTVENDOR" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="Name" visible="true" column="PRODUCTNAME" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Measure name="Sales" column="TOTALPRICE" datatype="Numeric" formatString="&#163;#,###.00" aggregator="sum" visible="true">
    </Measure>
  </Cube>
  <Role name="Executive Role">
    <SchemaGrant access="all">
      <CubeGrant cube="Sales_FY2003_2005" access="all">
      </CubeGrant>
    </SchemaGrant>
  </Role>
  <Role name="Sales Manager Role">
    <SchemaGrant access="none">
      <CubeGrant cube="Sales_FY2003_2005" access="all">
      </CubeGrant>
    </SchemaGrant>
  </Role>
  <Role name="Analyst Role">
    <SchemaGrant access="none">
      <CubeGrant cube="Sales_FY2003_2005" access="all">
        <HierarchyGrant hierarchy="[CUSTOMERS.Customers]" topLevel="[CUSTOMERS.Customers].[Country]" bottomLevel="[CUSTOMERS.Customers].[City]" access="custom">
        </HierarchyGrant>
        <HierarchyGrant hierarchy="[PRODUCTS.Products]" access="all">
        </HierarchyGrant>
      </CubeGrant>
    </SchemaGrant>
  </Role>
  <Role name="Regional Manager Role">
    <SchemaGrant access="none">
      <CubeGrant cube="Sales_FY2003_2005" access="all">
        <HierarchyGrant hierarchy="[CUSTOMERS.Customers]" topLevel="[CUSTOMERS.Customers].[State]" access="custom">
          <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[NJ]" access="all">
          </MemberGrant>
          <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[NY]" access="all">
          </MemberGrant>
          <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[PA]" access="all">
          </MemberGrant>
        </HierarchyGrant>
        <HierarchyGrant hierarchy="[PRODUCTS.Products]" access="all">
        </HierarchyGrant>
      </CubeGrant>
    </SchemaGrant>
  </Role>
</Schema>
```

{% endcode %}

***

{% hint style="info" %}

#### Descripción general de conceptos de seguridad

Antes de implementar seguridad, es importante entender la jerarquía de concesiones de seguridad en Mondrian:
{% endhint %}

{% hint style="danger" %}
Importante: Otorgar acceso a un elemento hijo otorga implícitamente acceso a su padre. Por ejemplo, otorgar acceso a un cubo otorga implícitamente acceso al esquema.
{% endhint %}

<table><thead><tr><th width="166" valign="top">Tipo de concesión</th><th valign="top">Descripción</th></tr></thead><tbody><tr><td valign="top">SchemaGrant</td><td valign="top">Controla el acceso a todo el esquema</td></tr><tr><td valign="top">CubeGrant</td><td valign="top">Controla el acceso a cubos individuales dentro de un esquema</td></tr><tr><td valign="top">DimensionGrant</td><td valign="top">Controla el acceso a dimensiones completas</td></tr><tr><td valign="top">HierarchyGrant</td><td valign="top">Controla el acceso a jerarquías y puede restringir por nivel (topLevel, bottomLevel)</td></tr><tr><td valign="top">MemberGrant</td><td valign="top">Controla el acceso a miembros específicos dentro de una jerarquía</td></tr></tbody></table>

***

1. Iniciar Schema Workbench:

{% hint style="info" %}

#### Windows (Powershell):

```powershell
cd \
cd Pentaho/design-tools/schema-workbench/
./workbench.bat
```

{% endhint %}

{% hint style="info" %}

#### Linux:

```bash
cd
cd Pentaho/design-tools/schema-workbench/
./workbench.sh
```

{% endhint %}

2. Asegúrate de que el Pentaho Server esté en ejecución:

{% hint style="danger" %}
**Asegúrate de que el Pentaho Server esté arrancado y en ejecución (iniciado automáticamente en Pentaho Lab):**

```bash
cd
cd /opt/pentaho/server/pentaho-server
sudo ./start-pentaho.sh
```

{% endhint %}

{% tabs %}
{% tab title="1. Configuración" %}
{% hint style="info" %}

#### Configuración

¡Vamos a profundizar aún más..!

El Gerente Regional solo debe ver datos para la región Oeste de EE. UU., estados que incluyen California, Oregón y Washington.
{% endhint %}

{% tabs %}
{% tab title="1. Usuarios y Roles" %}
{% hint style="info" %}

#### Usuarios y Roles

Crearemos varios usuarios de prueba para demostrar diferentes escenarios de seguridad:
{% endhint %}

<table><thead><tr><th width="140" valign="top">Nombre de usuario</th><th width="192" valign="top">Rol</th><th valign="top">Propósito</th></tr></thead><tbody><tr><td valign="top">exec_user</td><td valign="top">Ejecutivo</td><td valign="top">Acceso completo a todos los datos</td></tr><tr><td valign="top">sales_mgr</td><td valign="top">Gerente de Ventas</td><td valign="top">Acceso solo al cubo de ventas</td></tr><tr><td valign="top">region_mgr</td><td valign="top">Gerente Regional</td><td valign="top">Limitado solo a regiones específicas</td></tr><tr><td valign="top">analyst</td><td valign="top">Analista</td><td valign="top">Solo datos resumidos, sin registros detallados</td></tr></tbody></table>

1. Inicia sesión en Pentaho User Console como Administrador.

&#x20;      Nombre de usuario: admin

&#x20;       Contraseña: password

2. Navega a la Perspectiva de Administración desde el menú desplegable.
3. Selecciona Users & Roles > Manage Users.
4. Haz clic en el signo + para crear cada usuario de la tabla anterior con la contraseña: password

<figure><img src="/files/1f5c2b13f4e330a7cf1214f587c6cb1e1a2f49af" alt=""><figcaption><p>Agregar usuarios</p></figcaption></figure>

2. Navega a Users & Roles > Manage Roles
3. Asigna los siguientes Roles / Permisos al usuario:

| Rol               | Permisos                                                                                                          | Usuario     |
| ----------------- | ----------------------------------------------------------------------------------------------------------------- | ----------- |
| Ejecutivo         | Todos los permisos                                                                                                | exec\_user  |
| Gerente de Ventas | <p>Programar contenido </p><p>Leer contenido </p><p>Publicar contenido </p><p>Crear contenido </p><p>Ejecutar</p> | sales\_mgr  |
| Gerente Regional  | <p>Programar contenido </p><p>Leer contenido </p><p>Publicar contenido </p><p>Crear contenido </p><p>Ejecutar</p> | region\_mgr |
| Analista          | <p>Publicar contenido </p><p>Crear contenido </p>                                                                 | analyst     |

<figure><img src="/files/96bafe82756e875a2d0967c4bdbdef403ba85722" alt=""><figcaption><p>Asignar Roles / Permisos al usuario</p></figcaption></figure>
{% endtab %}

{% tab title="2. Mapeador de Roles" %}
{% hint style="info" %}

#### Mapeador de Roles

El mapeador de roles conecta los roles de usuario de Pentaho con los roles del esquema de Mondrian. Usaremos el mapeador de roles Lookup Map para demostrar un mapeo de roles flexible.
{% endhint %}

1. Abre el archivo - pentahoObjects.spring.xml:

```bash
cd
cd /opt/pentaho/server/pentaho-server/pentaho-solutions/system
sudo nano pentahoObjects.spring.xml
```

2. Localiza la sección Mondrian-UserRoleMapper (aproximadamente línea 295)
3. Comenta el mapeador One-to-One por defecto si está activo:

```xml
<!-- Disabled for workshop
<bean id="Mondrian-UserRoleMapper"
  name="Mondrian-One-To-One-UserRoleMapper"
  class="org.pentaho.platform.plugin.action.mondrian.mapper.MondrianOneToOneUserRoleListMapper"
  scope="singleton" />
-->
```

4. Descomenta y configura el mapeador de roles Lookup Map:

```xml
<bean id="Mondrian-UserRoleMapper"
  name="Mondrian-SampleLookupMap-UserRoleMapper"
  class="org.pentaho.platform.plugin.action.mondrian.mapper.MondrianLookupMapUserRoleListMapper"
  scope="singleton">
  <property name="lookupMap">
    <map>
      <entry key="Executive" value="Executive Role" />
      <entry key="Sales Manager" value="Sales Manager Role" />
      <entry key="Regional Manager" value="Regional Manager Role" />
      <entry key="Analyst" value="Analyst Role" />
    </map>
  </property>
</bean>
```

5. Guarda el archivo.
6. Reinicia el servidor Pentaho para que los cambios surtan efecto.

{% hint style="info" %}

#### Linux:

```bash
cd
cd /opt/pentaho/server/pentaho-server
sudo ./stop-pentaho.sh
```

```bash
cd
cd /opt/pentaho/server/pentaho-server
sudo ./start-pentaho.sh
```

{% endhint %}

{% hint style="info" %}
La clave representa el nombre del rol en Pentaho y el valor representa el nombre del rol de Mondrian que se definirá en el esquema.
{% endhint %}
{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="2. SchemaGrant" %}
{% hint style="info" %}

#### SchemaGrant

SchemaGrant controla el acceso al esquema Miniature Models. Implementaremos dos escenarios:&#x20;

acceso completo:&#x20;

sin acceso:&#x20;
{% endhint %}

{% hint style="danger" %}

#### Actualizar la caché del esquema de Mondrian

Por favor recuerda actualizar la caché del esquema de Mondrian cada vez que edites y guardes el esquema Miniature Models - security.xml ..
{% endhint %}

1. Inicia sesión como Administrador.&#x20;

&#x20;      Contraseña: password

<figure><img src="/files/6554bca76ff8522d1147e5baa910d794389c77c4" alt=""><figcaption><p>Actualizar la caché de Mondrian </p></figcaption></figure>

***

Sigue los pasos a continuación para entender la diferencia entre Acceso completo y Sin acceso:

{% tabs %}
{% tab title="1. Acceso completo" %}
{% hint style="info" %}

#### Acceso completo - Rol Ejecutivo

El rol Ejecutivo debe tener acceso irrestricto a todos los cubos y dimensiones del esquema. El método más sencillo para aplicar SchemaGrant es editando
{% endhint %}

1. Abre el esquema Miniature Models - original.xml.
2. Guardar como: Miniature Models - security.

<figure><img src="/files/c4db5abf2bcaaafdc015c42b02c0899b026fc918" alt=""><figcaption><p>Miniature Models -security.xml</p></figcaption></figure>

2. Resalta Schema y haz clic en 'User shadow+'.
3. Ingresa: **Executive Role** y tab para establecer el valor.
4. Click derecho sobre Executive Role y selecciona: Add Schema Grant:

<figure><img src="/files/026c775b4b4097d05678ab91de35ee4ed810d0a9" alt=""><figcaption><p>Establecer Executive Role</p></figcaption></figure>

5. Selecciona: **all** y tab para establecer el valor:

<figure><img src="/files/52720b478462cc56cbe77b7e31132f767a74ac26" alt=""><figcaption><p>Acceso Schema Grant = all</p></figcaption></figure>

6. Click derecho sobre el Schema Grant y agrega Cube Grant:

<figure><img src="/files/783f8950c9a0c6bd1bfb129fc011668af4cf8c7b" alt=""><figcaption><p>Agregar Cube Grant</p></figcaption></figure>

6. Establecer acceso: **all**
7. Desde el desplegable de cubos, selecciona: Sales\_FY2003\_2005:

<figure><img src="/files/0335d152539d1590c373f8b03c9f7d02f28a5d86" alt=""><figcaption><p>Cube Grant solo para el cubo Sales_FY2003_2005</p></figcaption></figure>

```xml
<Role name="Executive Role">
    <SchemaGrant access="all">
        <CubeGrant cube="Sales_FY2003_2005" access="all">
        </CubeGrant>
    </SchemaGrant>
</Role>
```

6. Haz clic en Guardar y Publicar.

{% hint style="info" %}
Actualmente solo los usuarios con el rol Executive Role tienen acceso al esquema Miniature Models - security / cubo Sales\_FY2003\_2005 como fuente de datos ..
{% endhint %}

Para probar inicia sesión como: exec\_user

<figure><img src="/files/59e71c77f3c3afb0f196b6113cac0e2117bce3df" alt=""><figcaption><p>Fuentes de datos del Rol Ejecutivo</p></figcaption></figure>

Para probar inicia sesión como: analyst

<figure><img src="/files/64675ad7785a654e209ac49e4b161ec552e2e025" alt=""><figcaption><p>Fuentes de datos del Analista - ¡sin Miniature Models..!</p></figcaption></figure>
{% endtab %}

{% tab title="2. Sin acceso al esquema" %}
{% hint style="info" %}

#### Gerente de Ventas

Hasta ahora solo los usuarios con el rol Executive Role tienen acceso al esquema Miniature Models - security como fuente de datos. El siguiente paso es establecer acceso solo al cubo Sales\_FY2003\_2005 para los usuarios con el rol Sales Managers Role.&#x20;
{% endhint %}

1. Abre el esquema Miniature Models - security.xml.
2. Resalta Schema y haz clic en 'User shadow+'.
3. Ingresa: Sales Managers Role y tab para establecer el valor.
4. Click derecho sobre Sales Managers Role y selecciona: Add Schema Grant.
5. Selecciona: none y tab para establecer el valor:

<figure><img src="/files/ce591acf2d0b49844ffd5ef42d8f47f1a0a7bea5" alt=""><figcaption><p>Acceso Schema Grant = none</p></figcaption></figure>

6. Click derecho sobre el Schema Grant y agrega Cube Grant.
7. Establece el acceso: **all** y tab para establecer el valor.
8. Desde el desplegable de cubos, selecciona el cubo: Sales\_FY2003\_2005 y tab.

<figure><img src="/files/b45f011ba487c4127168cc2791fa73a40b463145" alt=""><figcaption></figcaption></figure>

```xml
<Role name="Sales Manager">
    <SchemaGrant access="none">
        <CubeGrant cube="Sales_FY2003_2005" access="all">
        </CubeGrant>
    </SchemaGrant>
</Role>
```

9. Haz clic en Guardar y Publicar.
10. Para probar inicia sesión como: sales\_mgr

<figure><img src="/files/05ea166d16fab0ed4b6d3e24dbe94a023996a1ca" alt=""><figcaption><p>sales_mgr</p></figcaption></figure>

{% hint style="info" %}
Establecer access='none' a nivel de SchemaGrant bloquea todos los cubos por defecto. El CubeGrant luego otorga selectivamente acceso al cubo Sales\_FY2003\_2005, otorgando implícitamente acceso también al esquema padre.

Recuerda actualizar la caché del esquema de Mondrian ..
{% endhint %}
{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="3. HierarchyGrant" %}
{% hint style="info" %}

#### HierarchyGrant

HierarchyGrant permite un control fino sobre qué niveles de una jerarquía pueden acceder los usuarios. Usaremos los atributos topLevel y bottomLevel para restringir la vista del rol Analista.

El rol Analista debe ver solo datos resumidos, sin acceso a los detalles más granulares. Restringiremos su vista para mostrar datos desde el nivel Country hasta el nivel City, pero no códigos postales individuales.

Así que vamos a tener que agregar algunos Niveles a nuestro Esquema:

All > Territory > Country > State > City > Customer Name
{% endhint %}

{% hint style="danger" %}

#### Actualizar la caché del esquema de Mondrian

Por favor recuerda actualizar la caché del esquema de Mondrian cada vez que edites y guardes el esquema Miniature Models - security.xml ..
{% endhint %}

1. Inicia sesión como Administrador.&#x20;

&#x20;      Contraseña: password

<figure><img src="/files/6554bca76ff8522d1147e5baa910d794389c77c4" alt=""><figcaption><p>Actualizar la caché de Mondrian </p></figcaption></figure>

***

1. Para agregar otro nivel, en el panel izquierdo, haz clic derecho en Customers (jerarquía) bajo CUSTOMERS y selecciona Add Level.
2. Para definir el nivel State, escribe o elige:&#x20;

<table><thead><tr><th valign="top">Atributo</th><th valign="top">Valor</th></tr></thead><tbody><tr><td valign="top">name</td><td valign="top">State</td></tr><tr><td valign="top">column</td><td valign="top">STATE</td></tr><tr><td valign="top">type</td><td valign="top">String</td></tr><tr><td valign="top">levelType</td><td valign="top">Regular</td></tr><tr><td valign="top">hideMemberIf</td><td valign="top">Never</td></tr></tbody></table>

3. Para definir el nivel City, escribe o elige:&#x20;

<table><thead><tr><th valign="top">Atributo</th><th valign="top">valor</th></tr></thead><tbody><tr><td valign="top">name</td><td valign="top">City</td></tr><tr><td valign="top">column</td><td valign="top">CITY</td></tr><tr><td valign="top">type</td><td valign="top">String</td></tr><tr><td valign="top">levelType</td><td valign="top">Regular</td></tr><tr><td valign="top">hideMemberIf</td><td valign="top">Never</td></tr></tbody></table>

***

1. Abre el esquema Miniature Models - security.xml.
2. Resalta Schema y haz clic en 'User shadow+'.
3. Ingresa: Analyst Role y tab para establecer el valor.
4. Click derecho sobre Analyst Role y selecciona: Add Schema Grant.
5. Selecciona: none y tab para establecer el valor:
6. Click derecho sobre el Schema Grant y agrega Cube Grant.
7. Establece el acceso: **all** y tab para establecer el valor.
8. Desde el desplegable de cubos, selecciona el cubo: Sales\_FY2003\_2005 y tab.
9. Click derecho sobre el Cube Grant y agrega Hierarchy Grant.

<figure><img src="/files/1e6ad6e0bd8cadcfdf89808cbc669c6afc9989c1" alt=""><figcaption><p>Agregar Hierarchy Grant - CUSTOMERS.Customers</p></figcaption></figure>

10. Desde las opciones del desplegable selecciona lo siguiente:

| Atributo    | Valor                             |
| ----------- | --------------------------------- |
| access      | custom                            |
| hierarchy   | \[CUSTOMERS.Customers]            |
| topLevel    | \[CUSTOMERS.Customers].\[Country] |
| bottomLevel | \[CUSTOMERS.Customers].\[City]    |

<figure><img src="/files/7ab2ec96d4ec7a6f1592d15eb93a3dfa8040b360" alt=""><figcaption><p>Establecer jerarquía [CUSTOMERS.Customers] topLevel y bottomLevel</p></figcaption></figure>

{% hint style="info" %}

#### Nivel superior e inferior

* **topLevel**: El nivel más alto (más agregado) que el usuario puede ver. Establecerlo en Country significa que el usuario no puede ver el nivel All.
* **bottomLevel**: El nivel más bajo (más detallado) que el usuario puede ver. Establecerlo en City significa que el usuario no puede ver datos individuales de tiendas.

**Resultado**: El Analista puede ver datos agregados desde Country > Region > City, pero no detalles a nivel Customer Name.
{% endhint %}

11. Click derecho sobre el Cube Grant y agrega Hierarchy Grant.
12. Desde las opciones del desplegable selecciona lo siguiente:

| Atributo  | Valor                |
| --------- | -------------------- |
| access    | all                  |
| hierarchy | \[PRODUCTS.Products] |

<figure><img src="/files/26a156ee9b5743d465f490a15560839335de57ef" alt=""><figcaption><p>Establecer jerarquía [PRODUCTS.Products]</p></figcaption></figure>

```xml
<Role name="Analyst">
    <SchemaGrant access="none">
        <CubeGrant cube="Sales_FY2003_2005" access="all">
            <HierarchyGrant hierarchy="[CUSTOMERS.Customers]" 
                            access="custom" 
                            topLevel="[CUSTOMERS.Customers].[Country]" 
                            bottomLevel="[CUSTOMERS.Customers].[City]">
            </HierarchyGrant>
            <HierarchyGrant hierarchy="[PRODUCTS.Products]" access="all">
            </HierarchyGrant>
        </CubeGrant>
    </SchemaGrant>
</Role>
```

13. Haz clic en Guardar y Publicar.

***

Para probar inicia sesión como: analyst

<figure><img src="/files/d2efb7a964423fdb3fef516d4fc11932c2d2aee3" alt=""><figcaption><p>Analista</p></figcaption></figure>

{% hint style="info" %}
Nota: El alcance de la jerarquía Customers ha sido restringido - sin Territory ni PostalCode
{% endhint %}
{% endtab %}

{% tab title="4. MemberGrant" %}
{% hint style="info" %}

#### Member Grant

¡Vamos a profundizar un poco más..!

El Rol de Gerente Regional solo debe ver datos para la región Este de EE. UU., que incluye: New York, New Jersey y Pennsylvania.
{% endhint %}

{% hint style="danger" %}

#### Actualizar la caché del esquema de Mondrian

Por favor recuerda actualizar la caché del esquema de Mondrian cada vez que edites y guardes el esquema Miniature Models - security.xml ..
{% endhint %}

1. Inicia sesión como Administrador.&#x20;

&#x20;      Contraseña: password

<figure><img src="/files/6554bca76ff8522d1147e5baa910d794389c77c4" alt=""><figcaption><p>Actualizar la caché de Mondrian </p></figcaption></figure>

***

1. Abre el esquema Miniature Models - security.xml.
2. Resalta Schema y haz clic en 'User shadow+'.
3. Ingresa: Regional Manager Role y tab para establecer el valor.
4. Click derecho sobre Regional Manager Role y selecciona: Add Schema Grant.
5. Selecciona: none y tab para establecer el valor:
6. Click derecho sobre el Schema Grant y agrega Cube Grant.
7. Establece el acceso: **all** y tab para establecer el valor.
8. Desde el desplegable de cubos, selecciona el cubo: Sales\_FY2003\_2005 y tab.
9. Click derecho sobre el Cube Grant y agrega Hierarchy Grant.
10. Desde las opciones del desplegable selecciona lo siguiente:

| Atributo  | Valor                           |
| --------- | ------------------------------- |
| access    | custom                          |
| hierarchy | \[CUSTOMERS.Customers]          |
| topLevel  | \[CUSTOMERS.Customers].\[State] |

<figure><img src="/files/ba6c2089b0cf7b1504dc7430c4e27c2967436e2d" alt=""><figcaption><p>Establecer jerarquía [CUSTOMERS.Customers] topLevel</p></figcaption></figure>

11. Click derecho sobre Hierarchy Grant para Agregar un Member Grant.

{% hint style="info" %}
Agrega las restricciones de Member para cada estado: \[NJ] \[NY] \[PA]
{% endhint %}

12. Repite el flujo de trabajo para agregar los siguientes Member Grants:

<table><thead><tr><th width="169">Atributo</th><th>Valor</th></tr></thead><tbody><tr><td>access</td><td>all</td></tr><tr><td>member</td><td>[CUSTOMERS.Customers].[NA].[USA].[NJ]</td></tr><tr><td></td><td>[CUSTOMERS.Customers].[NA].[USA].[NY]</td></tr><tr><td></td><td>[CUSTOMERS.Customers].[NA].[USA].[PA]</td></tr></tbody></table>

<figure><img src="/files/024542dea9df8debf42bbc6a4aa2fba0ad11c3fb" alt=""><figcaption><p>Establecer member [CUSTOMERS.Customers].[NA].[USA].[NJ]</p></figcaption></figure>

13. Finalmente agrega la jerarquía PRODUCTS.Products:

| Atributo  | Valor               |
| --------- | ------------------- |
| access    | all                 |
| hierarchy | {PRODUCTS.Products] |

<figure><img src="/files/2f6c0635c9e07312d30eaaa67b122d0195b2ea79" alt=""><figcaption><p>Establecer jerarquía [PRODUCTS.Products]</p></figcaption></figure>

14. Finalmente Guarda y Publica.

```xml
<Role name="Regional Manager Role">
    <SchemaGrant access="none">
        <CubeGrant cube="Sales_FY2003_2005" access="all">
            <HierarchyGrant hierarchy="[CUSTOMERS.Customers]" access="custom" topLevel="[CUSTOMERS.Customers].[State]">
                <!-- Only grant access to specific states - do NOT grant to NA or USA -->
                <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[NJ]" access="all">
                </MemberGrant>
                <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[NY]" access="all">
                </MemberGrant>
                <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[PA]" access="all">
                </MemberGrant>
            </HierarchyGrant>
            <HierarchyGrant hierarchy="[PRODUCTS.Products]" access="all">
            </HierarchyGrant>
        </CubeGrant>
    </SchemaGrant>
</Role>
```

{% hint style="info" %}
Con `access="custom"`, Mondrian deniega todo por defecto y solo permite lo que otorgas explícitamente. Al otorgar acceso solo a NJ, NY y PA, esos serán los únicos estados visibles.
{% endhint %}

***

Para probar inicia sesión como: region\_mgr

<figure><img src="/files/0fbc5a0f6159acb45f5db11faeba66f39e15d56f" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Observa topLevel: STATE. El comportamiento por defecto es restringir el total / SUM como un rollup Parcial.
{% endhint %}
{% endtab %}

{% tab title="5. Políticas de Rollup" %}
{% hint style="info" %}

#### Políticas de Rollup

Las políticas de rollup controlan **cómo se agregan las medidas cuando la seguridad basada en roles restringe el acceso a ciertos miembros** en una jerarquía de dimensión. Esto se vuelve crítico cuando tienes jerarquías con acceso restringido: topLevel y bottomLevel restringirán la agregación.

Cuando un rol restringe el acceso a ciertos miembros de dimensión, ¿qué debería pasar con los totales en niveles superiores? ¿Deberían incluir los datos restringidos o no?
{% endhint %}

<table><thead><tr><th width="142" valign="top">Política</th><th valign="top">Comportamiento</th></tr></thead><tbody><tr><td valign="top">full</td><td valign="top">Muestra el total completo incluyendo miembros ocultos. El usuario ve totales precisos a nivel de toda la compañía, pero no puede inferir valores ocultos si pocos miembros son visibles.</td></tr><tr><td valign="top">partial</td><td valign="top">Muestra el total solo de los miembros visibles. El usuario ve subtotales precisos para sus datos autorizados. Útil cuando los usuarios solo deben ver su alcance.</td></tr><tr><td valign="top">hidden</td><td valign="top">Oculta el total completamente si cualquier hijo no es accesible. Opción más restrictiva, evita cualquier inferencia de datos ocultos.</td></tr></tbody></table>

<table><thead><tr><th width="160">Tipo de rol</th><th width="191">Política recomendada</th><th>Razón</th></tr></thead><tbody><tr><td>Ejecutivo / VP</td><td>full</td><td>Necesitan una visión completa, con restricción en el drill-down</td></tr><tr><td>Gerente Regional</td><td>partial</td><td>Solo deberían ver los totales de su región</td></tr><tr><td>Colaborador</td><td>partial o hidden</td><td>Alcance limitado, sin necesidad de agregados</td></tr><tr><td>Analista (datos restringidos)</td><td>full</td><td>Necesita el contexto de los datos completos mientras trabaja con un subconjunto</td></tr></tbody></table>

{% hint style="info" %}
Recuerda que el nivel de agregación está determinado por las restricciones de acceso. Entonces.. Si el Gerente Regional necesita ver "totales completos pero drill-down limitado":

**Usa concesiones de arriba hacia abajo con denegaciones**:
{% endhint %}

```xml
<HierarchyGrant hierarchy="[CUSTOMERS.Customers]" 
              rollupPolicy="full" 
              access="custom">
    <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA]" access="all"/>
    <!-- Then deny all states -->
    <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[CA]" access="none"/>
    <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[CT]" access="none"/>
    <!-- ... deny all others ... -->
    <!-- Then grant access to the 3 states -->
    <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[NJ]" access="all"/>
    <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[NY]" access="all"/>
    <MemberGrant member="[CUSTOMERS.Customers].[NA].[USA].[PA]" access="all"/>
</HierarchyGrant>
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://academy.pentaho.com/schema-workbench/schema-workbench-es/banco-de-trabajo-de-esquemas/seguridad-de-datos/seguridad-de-mondrian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
