Security Module
The security
module provides utilities for implementing security features in Spryx applications, including permission handling, token claims validation, and related functionality.
Key Features
- Permission Management: Typed permission enums with consistent format
- Token Claims: Pydantic models for validating JWT claims
- Type Safety: Strong typing for security-related components
API Reference
Permissions
Permission definitions for Spryx applications.
This module defines standardized permission strings in a consistent format (resource:action) that can be used for role-based access control.
Classes
Permission
Bases: StrEnum
Standard permission strings for Spryx applications.
Permissions follow the format resource:action
where:
- resource: The entity being accessed (users, orders, etc.)
- action: The operation being performed (read, write, etc.)
Source code in spryx_core/security/permissions.py
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
|
Functions
has_all_permissions(user_permissions, required_permissions)
classmethod
Check if the given permissions include all the required permissions.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
user_permissions
|
List[Permission] | Set[Permission]
|
List or set of permissions to check |
required |
required_permissions
|
List[Permission] | Set[Permission]
|
List or set of permissions to look for |
required |
Returns:
Type | Description |
---|---|
bool
|
True if all required permissions are in the user_permissions |
Source code in spryx_core/security/permissions.py
has_permission(user_permissions, required_permission)
classmethod
Check if the given permissions include the required permission.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
user_permissions
|
List[Permission] | Set[Permission]
|
List or set of permissions to check |
required |
required_permission
|
Permission
|
The permission to look for |
required |
Returns:
Type | Description |
---|---|
bool
|
True if the required permission is in the user_permissions |
Source code in spryx_core/security/permissions.py
PlatformPermission
Bases: StrEnum
Standard permission strings for Spryx platform.
Permissions follow the format resource:action
where:
- resource: The entity being accessed (organization, application, etc.)
- action: The operation being performed (read, write, etc.)
Source code in spryx_core/security/permissions.py
Claims
JWT claims validation models for Spryx authentication.
This module provides Pydantic models for validating and working with JWT claims used in Spryx authentication system. It includes models for different token types (user and application tokens) with automatic discrimination between them.
Classes
AppClaims
Bases: BaseClaims
Token issued to a machine / application integrating with Spryx.
Source code in spryx_core/security/claims.py
BaseClaims
Bases: _CoreModel
Fields common to every access token issued by Spryx Auth.
Source code in spryx_core/security/claims.py
UserClaims
Bases: BaseClaims
Token issued to a human user belonging to an organization.
Source code in spryx_core/security/claims.py
Functions
is_app_claims(claims)
Usage Examples
Working with Permissions
The Permission
enum defines standardized permission strings:
from spryx_core import Permission
# Check if user has specific permissions
def check_user_permissions(user_permissions, required_permissions):
return all(perm in user_permissions for perm in required_permissions)
# Using with typed permissions
user_permissions = [Permission.READ_USERS, Permission.READ_ORDERS]
can_manage_users = check_user_permissions(user_permissions, [Permission.READ_USERS, Permission.WRITE_USERS])
Validating Token Claims
The claims models provide type-safe validation for JWT tokens:
from spryx_core import TokenClaims
import jwt
from datetime import datetime, timedelta, UTC
# Example JWT payload
payload = {
"iss": "spryx-auth",
"sub": "user123",
"aud": "my-app",
"iat": datetime.now(UTC),
"exp": datetime.now(UTC) + timedelta(hours=1),
"token_type": "user",
"permissions": ["users:read", "orders:read"]
}
# Encode token (in a real app, this would be done by the auth server)
secret = "your-secret-key"
token = jwt.encode(payload, secret, algorithm="HS256")
# Decode and validate token
def validate_token(token):
try:
# Decode token
decoded = jwt.decode(token, secret, algorithms=["HS256"])
# Validate and cast to appropriate type
claims = TokenClaims.model_validate(decoded)
# The claims object will be either UserClaims or AppClaims
# based on the token_type discriminator
return claims
except Exception as e:
print(f"Token validation failed: {e}")
return None
# Use the validated claims
claims = validate_token(token)
if claims and hasattr(claims, "permissions"):
# It's a UserClaims object
user_permissions = claims.permissions
print(f"User has permissions: {user_permissions}")
Difference Between UserClaims and AppClaims
Spryx supports two types of tokens:
- User Tokens (
UserClaims
): Issued to human users and contain user-specific permissions. - App Tokens (
AppClaims
): Issued to machine clients/applications and contain scopes rather than permissions.
The TokenClaims
type uses discriminated unions to automatically cast to the correct type based on the token_type
field.