| name | litestar-auth-guards |
| description | Auto-activate for guards=, Guard, ASGIConnection, JWTAuth, JWTCookieAuth, SessionAuth, role or tenant checks, or WebSocket auth. Not for frontend route protection. |
Litestar Auth and Guards
Use this skill for authentication boundaries, authorization checks, guard composition, and user context.
Code Style Rules
- Put auth and permission checks in Guards or middleware, not handler bodies.
- Prefer Controller-level guards when a whole domain shares a policy.
- Raise Litestar HTTP exceptions or domain exceptions consistently.
- Keep tenant isolation explicit in guard logic and service filters.
- Let authentication middleware populate
connection.user and
connection.auth; use guards for authorization.
Quick Reference
Workflow
- Determine where identity is loaded.
- Add Guards at app, Controller, or route scope.
- Keep permission checks reusable and testable.
- Verify denial paths and authenticated success paths.
Guardrails
- Do not inline auth checks in handlers.
- Do not make Guards perform database work repeatedly when middleware can load the user once.
- Do not trust client-supplied tenant IDs without server-side scoping.
- Do not use HTTP-only assumptions for WebSocket auth.
- Do not claim WebSocket handshakes cannot carry headers. Non-browser clients
can send them; the browser WebSocket API cannot set arbitrary headers.
Validation Checkpoint
Example
from litestar.connection import ASGIConnection
from litestar.exceptions import PermissionDeniedException
from litestar.handlers import BaseRouteHandler
async def requires_active_user(connection: ASGIConnection, _: BaseRouteHandler) -> None:
if not connection.user or not connection.user.is_active:
raise PermissionDeniedException("Authentication required")
References Index
Official References
Shared Styleguide Baseline