Auth User Plugin
The Auth User plugin provides comprehensive user authentication and management functionality for FastPluggy applications.
📊 Current Status
✅ PRODUCTION READY FEATURES:
- Complete admin interface for user management (CRUD operations)
- User authentication with secure password hashing
- Session management with configurable expiration
- User profile pages with authentication protection
- Automatic admin user creation on first install
- Menu integration for user functions
⚠️ PARTIALLY IMPLEMENTED:
- Login routes (exist but commented out - ready for activation)
📋 ROADMAP: See Implementation Roadmap for detailed development plan.
Features
- User Authentication: Secure username/password authentication with BCrypt hashing
- Admin Interface: Complete user management with list, add, edit functionality
- Session Management: Configurable session handling with JSON data storage
- User Profiles: Protected profile pages for authenticated users
- Menu Integration: Automatic menu items for profile and logout
- Template System: Jinja2 templates for login and profile pages
- Database Integration: SQLAlchemy models with FastPluggy core
Models
FastPluggyBaseUser
The main user model with the following fields:
username: Unique username (String, 255 chars)hashed_password: Securely hashed password (String, 255 chars)is_admin: Boolean flag indicating admin privileges (default: False)
Session
Session management model for user authentication:
session_id: Unique session identifier (String, 255 chars)session_data: JSON data stored in the sessionsession_lifetime: Session expiration timestampsession_time: Session creation timestampip: Client IP captured at login (nullable; only set whencollect_login_ipis enabled)user_agent: Raw User-Agent captured at login (nullable)last_seen_at: Last activity timestamp, refreshed (throttled) on authenticated requests (nullable)
Session management
Both authenticated users and admins can review and revoke sessions:
- Self-service —
GET /profile/sessions/lists the current user's active sessions with device (heuristic User-Agent parse), IP, relative last-seen, created/expires. Revoke a single session or "revoke all other sessions". The IP column is hidden entirely whencollect_login_ipis disabled. - Admin-wide —
GET /admin/users/sessions/(requires thefp_adminrole) lists every active session across all users with a username filter, and can revoke any individual session or all of a given user's sessions.
last_seen_at is refreshed inside the authentication path but throttled to
at most one write per session_last_seen_throttle seconds, and is wrapped so a
tracking failure can never break authentication. Set session_track_metadata
to false to disable User-Agent capture and last-seen tracking entirely.
Configuration
The plugin uses AuthUserConfig class with the following settings:
from fastpluggy.core.config import BaseDatabaseSettings
from typing import Optional, Literal
class AuthUserConfig(BaseDatabaseSettings):
# Set to None to enable UI-based setup on first install
# If None, admin user creation will be handled via setup UI
default_admin_username: Optional[str] = None
default_admin_password: Optional[str] = None
# Auth backend: "session" (cookies + tokens + login redirect) or "basic" (HTTP Basic popup)
auth_backend: Literal["session", "basic"] = "session"
login_template: str = 'auth_user/login.html'
collect_login_ip: bool = True
allow_api_tokens: bool = True # set to False to disable personal access tokens globally
# Per-session metadata (device / IP / last-seen on the sessions pages)
session_track_metadata: bool = True # capture user-agent + refresh last_seen_at
session_last_seen_throttle: int = 60 # min seconds between last_seen_at writes
| Setting | Default | Effect |
|---|---|---|
collect_login_ip |
True |
Capture client IP at login; gates the IP column on the sessions pages |
session_track_metadata |
True |
Capture User-Agent at login and refresh last_seen_at on activity |
session_last_seen_throttle |
60 |
Minimum seconds between last_seen_at writes (keeps the auth path cheap) |
Auth backends
| Backend | auth_backend |
How it works |
|---|---|---|
| Session (default) | "session" |
Cookie-based sessions + Bearer tokens + HTTP Basic with __token__ (pip/twine). Redirects to login page on auth failure. |
| Basic | "basic" |
HTTP Basic authentication only. Triggers browser popup on auth failure. |
The auth backend is configurable via environment variable or database settings:
AUTH_USER_AUTH_BACKEND=basic # or "session" (default)
Admin User Setup
The plugin provides intelligent admin user setup with two approaches:
🎯 Recommended: UI-Based Setup (Default)
By default, default_admin_username and default_admin_password are set to None, which enables the setup UI:
- First Install: When no users exist, visit
/setup/to create the first admin user - Secure: No hardcoded credentials - you choose the username and password
- User-Friendly: Clean web interface with validation and error handling
- Automatic Detection: The system automatically detects when setup is needed
🔧 Alternative: Automatic Creation with Configured Credentials
If you prefer automatic admin creation, configure default credentials:
# In your environment or config
default_admin_username = "your_admin_username"
default_admin_password = "your_secure_password"
When configured, the plugin will automatically create the admin user on first startup.
📋 Setup Process
- Plugin Load: System checks if any users exist
- If No Users:
- With configured credentials: Automatically creates admin user
- Without credentials (default): Logs message to visit
/setup/
- Setup UI: Visit
/setup/to create admin user with custom credentials - Redirect: After successful setup, redirects to login page
🔍 Setup Status Check
You can check if setup is needed programmatically:
from fastpluggy_plugin.auth_user.src.repository import needs_initial_setup
from fastpluggy.core.database import get_db
if needs_initial_setup(get_db()):
print("Setup required - visit /setup/")
else:
print("Admin user exists")
Routes
Setup Routes
GET /setup/- Initial admin user setup page (only accessible when no users exist)POST /setup/- Process admin user creation formGET /setup/check- API endpoint to check if setup is needed
Authentication Routes
GET /logout- Logout user and clear session
Profile Routes
GET /profile/- User profile page (requires authentication)
Menu Integration
The plugin automatically adds the following menu items:
- Profile (
/profile/) - User profile page - Logout (
/logout) - Logout functionality
Templates
The plugin expects the following Jinja2 templates:
auth_user/profile.html.j2- User profile page templateauth_user/login.html.j2- Login page template (referenced in config)
Usage
- Install the plugin — it is auto-discovered via the
fastpluggy.pluginsentry point - Auth is auto-wired — the plugin calls
fast_pluggy.set_auth_manager()duringon_load_complete, so you do not need to passauth_manager=toFastPluggy(). JustFastPluggy(app)is enough. - First run — visit
/setup/to create the first admin user (or setdefault_admin_username/default_admin_passwordin config for automatic creation) - Profile — authenticated users can manage their profile at
/profile/
If you pass
auth_manager=explicitly toFastPluggy(), the plugin respects it and does not override.
Personal Access Tokens
Users can create long-lived API tokens for programmatic access (CI/CD, pip, twine, scripts).
Managing tokens
Tokens are managed via the UI at /tokens/:
- Create a token with a name and optional expiry (in days)
- The raw token value is shown once — copy it immediately
- Revoke any token at any time
Using tokens — API clients (Bearer)
Authorization: Bearer <your-token>
Any endpoint protected by require_authentication accepts this header.
Using tokens — pip / twine (HTTP Basic)
pip and twine use HTTP Basic auth. Use __token__ as the username and your token as the password:
# pip install
pip install --index-url https://__token__:<your-token>@registry.fastpluggy.xyz/pypi/simple/ my-package
# twine upload
twine upload --repository-url https://registry.fastpluggy.xyz/pypi/ \
-u __token__ -p <your-token> dist/*
Or configure ~/.pypirc:
[fastpluggy]
repository = https://registry.fastpluggy.xyz/pypi/
username = __token__
password = <your-token>
SessionAuthManager detects the __token__ username in Basic auth headers and validates the password as a personal access token (SHA256 hash lookup), so no separate auth scheme is needed for pip/twine.
Token model
| Field | Description |
|---|---|
name |
User-friendly label |
token_hash |
SHA256 of the raw token (never stored in plaintext) |
expires_at |
Optional expiry timestamp |
last_used_at |
Updated on every successful use |
Security Notes
- Passwords are securely hashed using BCrypt (
BasicAuthManager.hash_password()) - Sessions are managed with configurable lifetime (default: 1 hour)
- Admin privileges are controlled via the
is_adminboolean field - API tokens are stored as SHA256 hashes (never in plaintext)
- Important: Change the default admin password after first login for security
Metadata
Release files for fastpluggy-auth-user 0.2.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastpluggy_auth_user-0.2.7.tar.gz | 53.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastpluggy_auth_user-0.2.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 117.4 kB
Release files / fastpluggy_auth_user-0.2.7.tar.gz
| Download URL | fastpluggy_auth_user-0.2.7.tar.gz |
|---|---|
| Size | 53.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4ad31db442708f2a643434628c6880ac36b8d35fe4a3cce3e0dcfab7aef3a81
|
|
BLAKE2b-256 checksum How to use checksums |
dea70840099d7320505135e0efb114126232a1390e5e3385a78fc75c6a47f191
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.13
|
Release files / fastpluggy_auth_user-0.2.7-py3-none-any.whl
| Download URL | fastpluggy_auth_user-0.2.7-py3-none-any.whl |
|---|---|
| Size | 63.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d85e1fce93beb5c32a8a7ba0c2e7b1663c1b92c9990409aac7f4fc10e1d337d2
|
|
BLAKE2b-256 checksum How to use checksums |
9af687dcab2eb1d487e0198c0708b75c2d52ddd099046cdbf6664610ccee4386
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.13
|