for_user_role_sql
Definition
The property for_user_role_sql specifies how user roles are assigned to entities during syncing, by setting for_user_role for the entities. This enables entity-level role-based access control, allowing you to restrict which users can see specific entities based on their assigned roles.
Special Value: ALLOW_ALL
The special value _ALLOW_ALL_ can be used to make an entity accessible to all users without any role restriction. When the SQL returns _ALLOW_ALL_, no for_user_role is set on the entity, and any roles returned by other for_user_role_sql for that entity are also ignored.
This is useful when you want some entities to be public while others are restricted.
Examples
Example 1: Simple Role Assignment
This example shows a basic for_user_role_sql for a Customer class, where access is restricted based on the customer's region:
kb {
class Customer {
name.en: "Customer"
from_table: customer
// e.g. 00042
sql: "${customer.id}"
// e.g. Arthur Dent
name_sql.en: "${customer.name}"
// Restrict access based on region
for_user_role_sql: "${customer.region_role}"
}
}The entities will look like this (assuming region_role contains values like "EMEA_Sales"):
kb.Customer {
entity 00042_Arthur_Dent_1234 {
name.en: "Arthur Dent"
for_user_role: "EMEA_Sales"
id: "00042"
}
...
}With this configuration, only users with the "EMEA_Sales" role will be able to see and query this entity.
Example 2: Conditional Role Assignment
This example uses a SQL CASE expression to conditionally assign roles based on data values:
kb {
class Order {
name.en: "Order"
from_table: orders
sql: "${orders.id}"
name_sql.en: "'Order #' || ${orders.id}"
// Assign role based on order value
for_user_role_sql:
"""
CASE
WHEN ${orders.total_amount} > 10000 THEN 'HighValueSales'
ELSE 'StandardSales'
END
"""
}
}Example 3: Multiple Role Columns
You can specify multiple for_user_role_sql properties to assign roles from different columns, allowing users with either role to see the entity:
kb {
class Customer {
name.en: "Customer"
from_table: customer
sql: "${customer.id}"
name_sql.en: "${customer.name}"
// Assign multiple roles from different columns
for_user_role_sql: [
"${customer.region_role}",
"${customer.department_role}"
]
}
}Usage with entities_custom_sql
When using entities_custom_sql, you can include FOR_USER_ROLE columns to achieve the same effect:
kb {
class Customer {
name.en: "Customer"
sql: "${customer.id}"
from_table: customer
entities_custom_sql:
"""
SELECT
c.id AS ID,
c.name AS LABEL_EN_MAIN,
c.region_role AS FOR_USER_ROLE
FROM
customer c
"""
}
}Multiple role columns can be specified as FOR_USER_ROLE, FOR_USER_ROLE_1, FOR_USER_ROLE_2, etc.
For more details and best practices about defining classes and entities using custom SQL, see Class with Custom Entities defined by a SQL.