Role and Permission Management#
Overview#
Superset's role and permission system is built on Flask-AppBuilder (FAB) RBAC, extended by SupersetSecurityManager . The core building blocks are:
- Permission — an action name (e.g.
can_read,can_write,datasource_access) - ViewMenu — a resource name (e.g.
Dashboard,Chart, a specific database) - PermissionView (PVM) — a
(Permission, ViewMenu)pair stored inab_permission_view - Role — a named set of PVMs; users gain access by holding one or more roles
Four built-in roles are managed by Superset: Admin, Alpha, Gamma, and sql_lab. These are rebuilt on every superset init . Object-scoped permissions (database_access, schema_access, datasource_access) are never assigned to built-in roles — they are managed per-object via SQLAlchemy event hooks .
Scope note: This article covers the schema, management APIs, and utility methods for roles and permissions. For how permissions are initialized/deduplicated see Permission Registration; for runtime access enforcement see Access Control; for frontend propagation see Permission Propagation.
Database Schema#
Superset inherits FAB's five-table RBAC schema :
| Table | Key Columns | Purpose |
|---|---|---|
ab_permission | id, name | Action names (e.g. can_read) |
ab_view_menu | id, name | Resource names (e.g. Dashboard) |
ab_permission_view | id, permission_id → ab_permission, view_menu_id → ab_view_menu | PVM records; unique on (permission_id, view_menu_id) |
ab_permission_view_role | id, permission_view_id → ab_permission_view, role_id → ab_role | Assigns PVMs to roles; unique on (permission_view_id, role_id) |
ab_role | id, name | Role definitions |
The (permission_id, view_menu_id) unique constraint on ab_permission_view prevents duplicate PVMs. The (permission_view_id, role_id) unique constraint on ab_permission_view_role prevents duplicate role assignments .
During Alembic migrations, superset/migrations/shared/security_converge.py provides utilities to rename or restructure PVMs without losing role assignments — see migrate_roles() .
Managing Roles and Permissions#
CLI: superset init#
The primary way to provision built-in roles is the superset init command , which runs two operations in sequence:
appbuilder.add_permissions(update_perms=True)— registers all FAB view/action PVMs in the databasesecurity_manager.sync_role_definitions()— rebuilds Admin, Alpha, Gamma, sql_lab role memberships and cleans up orphaned PVMs
There are no dedicated CLI commands for exporting or importing roles — role management at the CLI level is exclusively via superset init .
REST API#
RoleRestAPI at GET /api/v1/security/roles/search/ lists roles with pagination and filtering . RISON query parameters:
| Parameter | Options |
|---|---|
filters[col] | user_ids, permission_ids, group_ids, name |
order_column | id, name |
page / page_size | integer (default 0 / 10) |
Each returned role object includes id, name, user_ids, permission_ids, and group_ids arrays. The endpoint requires the list_roles permission and is admin-only .
Full role CRUD (create, read, update, delete) is provided by the inherited FAB RoleApi, exposed via SupersetRoleApi . The only Superset-specific override is pre_delete(), which clears item.permissions before deletion to satisfy database constraints.
UI#
RolesListView at /roles/ renders the modern frontend SPA for role management . It is registered under the Security menu as "List Roles" . The legacy FAB RoleModelView is explicitly removed during security manager initialization in register_views() . The SUPERSET_SECURITY_VIEW_MENU config key (default: True) controls whether the Security menu appears at all .
Migration-Time Permission Management#
security_converge.py is used inside Alembic migrations to rename or restructure permissions without losing existing role assignments. Key functions :
add_pvms()— creates new Permission, ViewMenu, and PVM records if they don't existmigrate_roles()— maps old PVMs to new ones across all roles, then deletes the old records_delete_old_permissions()— cleans up orphaned PVMs, permission names, and view menus post-migration
Key Methods in SupersetSecurityManager#
All methods are in superset/security/manager.py :
| Method | Lines | Purpose |
|---|---|---|
sync_role_definitions() | 1098–1123 | Orchestrates full role/permission sync: creates custom perms, rebuilds built-in roles, fills missing PVMs, cleans orphans |
set_role() | 1198–1216 | Rebuilds a role's PVM list using a predicate function |
copy_role() | 1167–1196 | Copies PVMs from one role to another; merge=True preserves existing data-access permissions on the target |
get_user_roles() | 2472–2478 | Returns a user's roles; for anonymous users returns the public role if AUTH_ROLE_PUBLIC is set, else [] |
create_custom_permissions() | 1032–1047 | Registers Superset-specific PVMs (e.g. all_datasource_access, can_sqllab, can_tag) |
clean_perms() | 1081–1096 | Deletes PVMs where either the Permission or ViewMenu side is NULL |
create_missing_perms() | 1049–1079 | Adds PVMs for database/dataset/schema objects not yet covered; uses a local set to avoid duplicate DB round-trips |
copy_role() accepts either a concrete role name or a builtin role with regex-pattern matching (via _get_pvms_from_builtin_role()). It is used by sync_role_definitions() to optionally mirror a role's permissions onto the Public role via the PUBLIC_ROLE_LIKE config key .
Key Source Files#
| File | Purpose |
|---|---|
superset/security/manager.py | SupersetSecurityManager — all role/PVM CRUD, role sync, copy_role, get_user_roles |
superset/security/api.py | RoleRestAPI (role listing), SecurityRestApi (CSRF/guest tokens) |
superset/views/roles.py | RolesListView — frontend SPA entry point at /roles/ |
superset/cli/main.py | superset init command — triggers role/permission sync |
superset/migrations/shared/security_converge.py | Migration utilities: migrate_roles(), add_pvms(), _delete_old_permissions() |
superset/initialization/__init__.py | Registers RolesListView and RoleRestAPI; SUPERSET_SECURITY_VIEW_MENU config |