Security context
Your authentication server issues JWTs to your client application, which, when sent as part of the request, are verified and decoded by Cube to get security context claims to evaluate access control rules. Inbound JWTs are decoded and verified using industry-standard JSON Web Key Sets (JWKS). For access control or authorization, Cube allows you to define granular access control rules for every cube in your data model. Cube uses both the request and security context claims in the JWT token to generate a SQL query, which includes row-level constraints from the access control rules. JWTs sent to Cube should be passed in theAuthorization: <JWT> header to
authenticate requests.
JWTs can also be used to pass additional information about the user, known as a
security context. A security context is a verified set of claims about the
current user that the Cube server can use to ensure that users only have access
to the data that they are authorized to access.
It will be accessible as the securityContext property
inside:
- The
query_rewriteconfiguration option in your Cube configuration file. - the
COMPILE_CONTEXTglobal, which is used to support multi-tenant deployments.
Contents
By convention, the contents of the security context should be an object (dictionary) with nested structure:Reserved elements
Some features of Cube Cloud (e.g., authentication integration) use thecubeCloud element in the security context.
This element is reserved and should not be used for other purposes.
Using query_rewrite
You can usequery_rewrite to amend incoming queries
with filters. For example, let’s take the following query:
user_id, sub and iat will
be injected into the security context:
query_rewrite in the configuration file:
Using COMPILE_CONTEXT
COMPILE_CONTEXT can be used to create fully dynamic data models. It enables you to create multiple versions of data model based on the incoming security context.
The first thing you need to do is to define the mapping rule from a security context to the id of the compiled data model.
It is done with context_to_app_id configuration option.
team property of the security context as a data model id.
COMPILE_CONTEXT inside your data model.
In the example below we are passing it as a variable into masked helper function.
masked helper function is defined in model/globals.py as follows: it checks if the current team is inside the list of trusted teams.
If that’s the case, it will render the SQL to get the value of the dimension; if not, it will return just the masked string.
Usage with pre-aggregations
To generate pre-aggregations that rely onCOMPILE_CONTEXT, configure
scheduledRefreshContexts in your cube.js configuration
file.
Usage for member-level security
You can also useCOMPILE_CONTEXT to control whether a data model entity should be
public or private dynamically.
In the example below, the customers view would only be visible to a subset
of tenants that have the team property set to marketing
in the security context:
query_rewrite configuration option][ref-query-rewrite] for that.
Testing during development
During development, it is often useful to be able to edit the security context to test access control rules. The Developer Playground allows you to set your own JWTs, or you can build one from a JSON object.Enriching the security context
Sometimes it is convenient to enrich the security context with additional attributes before it is used to evaluate access control rules.Extending the security context
You can use theextend_context configuration option to
enrich the security context with additional attributes.
Authentication integration
When using Cube Cloud, you can enrich the security context with information about an authenticated user, obtained during their authentication.Available on all plans.
Common patterns
Enforcing mandatory filters
You can usequery_rewrite to enforce mandatory filters that apply to all queries. This is useful when you need to ensure certain conditions are always met, such as filtering data by date range or restricting access to specific data subsets.
For example, if you want to only show orders created after a specific date across all queries, you can add a mandatory filter:
Enforcing role-based access
You can usequery_rewrite to enforce role-based access control by filtering data based on the user’s role from the security context.
For example, to restrict access so that users with the operator role can only view processing orders, while users with the manager role can only view shipped and completed orders:
Enforcing column-based access
You can usequery_rewrite to enforce column-based access control by filtering data based on relationships and user attributes from the security context.
For example, to restrict suppliers to only see their own products based on their email:
Controlling access to cubes and views
You can useextend_context and COMPILE_CONTEXT to control access to cubes and views based on user properties from the security context.
For example, to make a view accessible only to users with a department claim set to finance:
COMPILE_CONTEXT to control visibility: