Skip to main content

Two-layer RBAC (system + company) helpers for FastAPI / Flask / any Python backend — paired with the snipe-auth-rbac TS sibling.

Project description

snipe-auth-rbac (Python)

PyPI License: MIT

Python sibling of the snipe-auth-rbac npm package. Two-layer RBAC (system + per-company roles) for FastAPI, Flask, or any Python backend that talks to a Supabase / Postgres database.

The full picture — including the SQL schema, the TypeScript / React side, and the admin UI building blocks — lives in the top-level repo.

Install

pip install "snipe-auth-rbac[fastapi]"

Optional extras:

Extra What it pulls in
fastapi fastapi, starlette — needed for auth_rbac.deps
supabase supabase-py
dev ruff, pytest

Apply the SQL once

The tables and resolver functions live in a dedicated rbac schema. The simplest path on Supabase is the bundled npm CLI (a plain Node script — no JS knowledge needed):

npx snipe-auth-rbac install
supabase db push
# Then in Studio → Settings → API → Exposed schemas → add `rbac`

For other Postgres tooling, the canonical SQL files live at sql/0001_initial.sql and 0002_seed_defaults.sql in the repo.

FastAPI integration

from fastapi import FastAPI, Depends
from auth_rbac import PermissionsService, ResourceDescriptor
from auth_rbac.deps import (
    configure_auth_rbac,
    active_company_middleware,
    require_permission,
    require_system_permission,
)
from app.integrations.supabase import get_supabase_client

RESOURCES = [
    ResourceDescriptor("system_audit", "system",  "Audit-Log",      group="Plattform"),
    ResourceDescriptor("properties",   "company", "Liegenschaften", group="Stammdaten"),
    ResourceDescriptor("payments",     "company", "Zahlungen",      group="Finanzen"),
]

app = FastAPI()
service = PermissionsService(supabase=get_supabase_client(), resources=RESOURCES)

# Fail loudly on boot if the migration hasn't been applied or
# `rbac` isn't in the project's PostgREST exposed-schemas list.
service.require_schema()

# Upsert the typed registry into rbac.resources on every boot.
# Adding a new entry to RESOURCES + redeploying makes the matrix
# UI grow a new column — no manual migration step.
service.sync_resources()

async def resolve_user_id(request):
    return request.state.user_id   # adapter to your existing auth dep

configure_auth_rbac(service=service, user_id_resolver=resolve_user_id)
app.middleware("http")(active_company_middleware)

@app.get("/payments")
async def list_payments(_=Depends(require_permission("payments", "read"))):
    ...

@app.post("/system/companies")
async def create_company(
    _=Depends(require_system_permission("system_companies", "write")),
):
    ...

Other backends

auth_rbac.deps is FastAPI-specific, but PermissionsService itself is plain Python. For Flask / Litestar / starlette-bare:

from auth_rbac import PermissionsService

# Where you'd normally check role:
allowed = service.user_can(
    user_id=current_user.id,
    resource="payments",
    action="update",
    company_id=request.state.company_id,
)
if not allowed:
    abort(403)

Hydrating the full profile

For a /me/profile endpoint that returns every role + permission the user holds in one round-trip:

profile = service.hydrate_profile(user_id)
# profile.system_roles, profile.system_permissions,
# profile.memberships -> [CompanyMembership(roles, permissions, …)]

The result is cached for 30 seconds per user. Swap _ProfileCache for a Redis implementation if you need cross-process invalidation.

Pre-filling templates

service.apply_template_defaults(role_id="…", only_missing=True)
# Reads default_permissions JSONB on the role and inserts
# rbac.role_permissions rows for every resource that matches.

License

MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

snipe_auth_rbac-0.6.2.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

snipe_auth_rbac-0.6.2-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file snipe_auth_rbac-0.6.2.tar.gz.

File metadata

  • Download URL: snipe_auth_rbac-0.6.2.tar.gz
  • Upload date:
  • Size: 13.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snipe_auth_rbac-0.6.2.tar.gz
Algorithm Hash digest
SHA256 d9d7a150ddb00f323ec60f36031c29c3a39454110fc834e951ebc71ca5c7caa7
MD5 fbb4c771565017d8b9e64ae78fe9945f
BLAKE2b-256 aaa1f2d2573e10cc88428dac59a014ce459af6eb8e3da49f6dc749030a36fd42

See more details on using hashes here.

File details

Details for the file snipe_auth_rbac-0.6.2-py3-none-any.whl.

File metadata

File hashes

Hashes for snipe_auth_rbac-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 92bb71c695cce05f1c33d46ccb9fd1153e42ce3d4941c43c60b8e7cd945c5e7b
MD5 da1d4d89fcc3966731d4b5b55bb3dc55
BLAKE2b-256 d7c857223ef64d52fd72ab74cc537a59767d89d1fb0b6459a6756b3572d9bab6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page