Auth Backend Base
dagster_authkit.auth.backends.base
Base Authentication Backend
Abstract base class that all backends must implement. Includes Role hierarchy, AuthUser dataclass, and audit helpers.
Role
Bases: IntEnum
Hierarchical role levels matching Dagster+.
Numeric values allow simple comparisons
user.role >= Role.LAUNCHER
Hierarchy
VIEWER (10) - Read-only access LAUNCHER (20) - Execute runs (launchRun, terminateRun) EDITOR (30) - Manage schedules, sensors, assets ADMIN (40) - Full access + user management
RolePermissions
Defines GraphQL mutation permissions for each role.
Permissions are hierarchical: - ADMIN can do everything (ADMIN + EDITOR + LAUNCHER) - EDITOR can do EDITOR + LAUNCHER - LAUNCHER can do only LAUNCHER - VIEWER can only read
get_required_role
classmethod
get_required_role(mutation_name, default_role=None)
Get the minimum required role for a GraphQL mutation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mutation_name
|
str
|
Name of the GraphQL mutation (e.g. |
required |
default_role
|
Optional[Role]
|
Role for unrecognized mutations. |
None
|
Returns:
| Type | Description |
|---|---|
Optional[Role]
|
Required |
Optional[Role]
|
or |
Example::
>>> RolePermissions.get_required_role("launchRun")
Role.LAUNCHER
>>> RolePermissions.get_required_role("newMutation", Role.ADMIN)
Role.ADMIN
can_execute
classmethod
can_execute(user_role, mutation_name, default_role=None)
Check if a role can execute a mutation (respects role hierarchy).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
user_role
|
Role
|
User's role. |
required |
mutation_name
|
str
|
Name of the GraphQL mutation. |
required |
default_role
|
Optional[Role]
|
Default role for unknown mutations
(default: |
None
|
Returns:
| Type | Description |
|---|---|
bool
|
|
Example::
>>> RolePermissions.can_execute(Role.LAUNCHER, "launchRun")
True
>>> RolePermissions.can_execute(Role.VIEWER, "launchRun")
False
list_permissions
classmethod
list_permissions(role)
List all mutations a role can execute.
Includes inherited permissions from lower roles.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
role
|
Role
|
Role to check |
required |
Returns:
| Type | Description |
|---|---|
Set[str]
|
Set of mutation names |
Example
perms = RolePermissions.list_permissions(Role.EDITOR) "launchRun" in perms True "startSchedule" in perms True
AuthUser
dataclass
Universal user representation (backend-agnostic).
All backends (SQLite, LDAP, etc) return this format.
Attributes:
| Name | Type | Description |
|---|---|---|
username |
str
|
Unique username |
role |
Role
|
Role level (VIEWER/LAUNCHER/EDITOR/ADMIN) |
email |
str
|
Email address (optional) |
full_name |
str
|
Display name (optional) |
display_name
property
display_name
Friendly name for UI (fallback to username).
can
can(required_role)
Check if user has sufficient permissions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
required_role
|
Role
|
Minimum required role |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True if user.role >= required_role |
Example
user = AuthUser("john", Role.EDITOR) user.can(Role.LAUNCHER) # True (30 >= 20) user.can(Role.ADMIN) # False (30 < 40)
to_dict
to_dict()
Convert to dict (for session storage).
Uses role.value (int) as the canonical representation for consistency across all backends (SQL, LDAP, OIDC). from_dict() handles both int and string formats for backward compatibility with existing sessions.
Returns:
| Type | Description |
|---|---|
Dict[str, Any]
|
Dict with username, role, email, full_name |
from_dict
classmethod
from_dict(data)
Create AuthUser from dict. Robust enough to handle both String names and Integer values.
AuthBackend
Bases: ABC
Abstract base class for authentication backends.
All backends (SQLite, LDAP, OAuth, etc.) must inherit from this class and implement the abstract methods.
__init__
__init__(config)
Initializes backend with configuration.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config
|
Dict[str, Any]
|
Dict with settings (usually config.dict) |
required |
authenticate
abstractmethod
authenticate(username, password)
Authenticates user with username and password.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
username
|
str
|
Username |
required |
password
|
str
|
Password in plain text |
required |
Returns:
| Type | Description |
|---|---|
Optional[AuthUser]
|
AuthUser if authenticated, None if failed |
get_user
abstractmethod
get_user(username)
Fetches user info without authenticating.
Used for session validation (already authenticated).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
username
|
str
|
Username |
required |
Returns:
| Type | Description |
|---|---|
Optional[AuthUser]
|
AuthUser or None if user doesn't exist |
get_name
abstractmethod
get_name()
Returns backend identifier.
Returns:
| Name | Type | Description |
|---|---|---|
str |
str
|
Backend name (e.g., 'sqlite', 'ldap', 'dummy') |
add_user
add_user(username, password, role, email='', full_name='', performed_by='system', **kwargs)
Creates a new user (OPTIONAL - only for local backends).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
username
|
str
|
Username |
required |
password
|
str
|
Password in plain text (will be hashed) |
required |
role
|
Role
|
Role level (Role.ADMIN, Role.EDITOR, etc) |
required |
email
|
str
|
User's email |
''
|
full_name
|
str
|
Display name |
''
|
performed_by
|
str
|
Who created the user (for auditing) |
'system'
|
Returns:
| Name | Type | Description |
|---|---|---|
bool |
bool
|
True if created, False if failed |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
If backend doesn't support it (LDAP, OAuth) |
delete_user
delete_user(username, performed_by='system')
Removes a user (OPTIONAL - only for local backends).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
username
|
str
|
Username |
required |
performed_by
|
str
|
Who deleted the user (for auditing) |
'system'
|
Returns:
| Name | Type | Description |
|---|---|---|
bool |
bool
|
True if deleted, False if user doesn't exist |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
If backend doesn't support it |
change_password
change_password(username, new_password, performed_by='system')
Changes a user's password (OPTIONAL - only for local backends).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
username
|
str
|
Username |
required |
new_password
|
str
|
New password in plain text (will be hashed) |
required |
performed_by
|
str
|
Who changed it (for auditing) |
'system'
|
Returns:
| Name | Type | Description |
|---|---|---|
bool |
bool
|
True if changed, False if user doesn't exist |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
If backend doesn't support it |
list_users
list_users()
Lists all users (OPTIONAL - only for local backends).
Returns:
| Type | Description |
|---|---|
List[AuthUser]
|
List of AuthUser instances |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
If backend doesn't support it |
change_role
change_role(username, new_role, performed_by='system')
Changes a user's role (OPTIONAL).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
username
|
str
|
Username |
required |
new_role
|
Role
|
New role level |
required |
performed_by
|
str
|
Who changed it (for auditing) |
'system'
|
Returns:
| Name | Type | Description |
|---|---|---|
bool |
bool
|
True if updated |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
If backend doesn't support it |