test repo

This commit is contained in:
Нехорошев Михаил Владимирович committed 2026-08-31 16:18:11 +03:00
1 parent 7c0a85f00f
commit 1eff3aa2ea
27 files changed
+1161 -322

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
"""
Вспомогательная логика портала:
- получение списка AD-групп текущего пользователя (из объекта django-auth-ldap)
- подбор доступных Resource по этим группам
- выпуск короткоживущего подписанного токена для backend admin panel
"""
import time
from typing import Iterable
import jwt
from django.conf import settings
from .models import Resource, ResourceGroup
def get_user_ad_groups(user) -> set[str]:
"""
django-auth-ldap прикрепляет к user объект `ldap_user` с атрибутом group_names
(набор cn всех групп, в которых состоит пользователь в AD).
Для локального суперпользователя (не через LDAP) атрибута не будет —
возвращаем пустой набор, дальше он видит только ресурсы, явно открытые ModelBackend-группам.
"""
ldap_user = getattr(user, "ldap_user", None)
if ldap_user is None:
return set()
return set(ldap_user.group_names)
def get_available_resources(user) -> Iterable[Resource]:
if user.is_superuser:
return Resource.objects.filter(is_active=True).select_related("group")
ad_groups = get_user_ad_groups(user)
if not ad_groups:
return Resource.objects.none()
group_ids = ResourceGroup.objects.filter(ad_group_name__in=ad_groups).values_list("id", flat=True)
return Resource.objects.filter(group_id__in=group_ids, is_active=True).select_related("group")
def user_can_access_resource(user, resource: Resource) -> bool:
if user.is_superuser:
return True
return resource.group.ad_group_name in get_user_ad_groups(user)
def issue_resource_token(user, resource: Resource) -> str:
"""
Короткоживущий JWT, который backend admin panel может провалидировать
тем же RESOURCE_TOKEN_SECRET (см. docs/architecture.md, раздел 6).
"""
now = int(time.time())
payload = {
"sub": user.username,
"email": getattr(user, "email", ""),
"group": resource.group.ad_group_name,
"resource": resource.slug,
"iat": now,
"exp": now + settings.RESOURCE_TOKEN_TTL_SECONDS,
}
return jwt.encode(payload, settings.RESOURCE_TOKEN_SECRET, algorithm="HS256")