more admin stuff 2

This commit is contained in:
2026-08-20 17:10:19 +02:00
parent e8216b14e9
commit cd5957cbd2
19 changed files with 1120 additions and 78 deletions

View File

@ -204,6 +204,43 @@ async def _validate_api_token(token: str, *, resource: str, action: str) -> Curr
return CurrentUser(id=user_id, username=username, is_admin=False, token_tenant_id=tenant_id)
def require_admin_scope_or_host_role(resource: str, action: str, role_names: tuple[str, ...]):
"""Wie require_admin_or_scope, erlaubt zusaetzlich einen regulaeren
(Nicht-Admin-)User per Session, wenn er fuer den per Pfadparameter
'host_id' angegebenen Host mindestens eine der uebergebenen Hostgruppen-
Rollen besitzt (siehe RBAC-Erweiterung 'Credentials ins RBAC-Modell':
Rollen 'credentials_view'/'credentials_manage', app/models/schemas.py).
Token-Auth bleibt unveraendert ausschliesslich ueber den Admin-Scope
moeglich -- kein Token traegt je eine Hostgruppen-Rolle."""
async def _dep(
host_id: int,
response: Response,
jh_session: str | None = Cookie(default=None, alias=SESSION_COOKIE_NAME),
authorization: str | None = Header(default=None),
) -> CurrentUser:
if authorization and authorization.startswith("Bearer "):
token = authorization.removeprefix("Bearer ").strip()
principal = await _validate_api_token(token, resource=resource, action=action)
if principal is None:
raise HTTPException(
status.HTTP_401_UNAUTHORIZED,
"Ungueltiges, abgelaufenes oder nicht ausreichend berechtigtes Token",
)
return principal
user = await get_current_user(response, jh_session)
if user.is_any_admin:
return user
conn = get_db()
for role_name in role_names:
if await user_has_role_for_host(conn, user_id=user.id, host_id=host_id, role_name=role_name):
return user
raise HTTPException(status.HTTP_403_FORBIDDEN, "Keine Berechtigung fuer diese Zugangsdaten")
return _dep
def require_admin_or_scope(resource: str, action: str):
"""Dependency-Factory fuer die Admin-API: erlaubt Zugriff entweder ueber
eine eingeloggte Admin-Session (Super- ODER Mandanten-Admin, Cookie) ODER