Безопасность: Как реализовать метод getByAdminParameters, который ищет пользователя по Нику или SteamID только в контексте администраторских прав?
Реализация метода `getByAdminParameters` требует соблюдения нескольких принципов безопасности: проверки прав доступа, валидации входных данных и защиты от несанкционированного доступа.
## Основные принципы реализации
### 1. Проверка административных прав перед выполнением запроса
Первым делом метод должен убедиться, что вызывающий его пользователь обладает правами администратора. Это делается через middleware или декоратор:
python
def getByAdminParameters(self, request, nick: str = None, steam_id: str = None):
if not request.user.is_authenticated or not request.user.has_perm(‘users.admin_search’):
raise PermissionDenied(«Доступ разрешён только администраторам»)
if not nick and not steam_id:
raise ValueError(«Необходимо указать ник или SteamID»)
query = Q()
if nick:
query |= Q(username__iexact=nick)
if steam_id:
query |= Q(steam_id=steam_id)
return User.objects.filter(query).first()
### 2. Использование декораторов или аннотаций
В Java/Spring это реализуется через аннотацию `@PreAuthorize`:
java
@PreAuthorize(«hasRole(‘ADMIN’)»)
public User getByAdminParameters(String nick, String steamId) {
if (nick == null && steamId == null) {
throw new IllegalArgumentException(«Необходимо указать ник или SteamID»);
}
return userRepository.findByNickOrSteamId(nick, steamId)
.orElseThrow(() -> new UserNotFoundException(«Пользователь не найден»));
}
### 3. Логирование административных действий
Все административные запросы должны логироваться для аудита:
python
import logging
logger = logging.getLogger(‘admin_actions’)
def getByAdminParameters(self, request, nick=None, steam_id=None):
self._check_admin_rights(request.user)
logger.info(f»Admin {request.user.id} searched user: nick={nick}, steam_id={steam_id}»)
# … логика поиска
### 4. Валидация и санитизация входных данных
— SteamID должен соответствовать формату (например, `STEAM_0:1:XXXXXXX` или 64-битный формат).
— Ник не должен содержать SQL-инъекций (используйте ORM).
— Ограничивайте длину входных строк.
### 5. Rate limiting
Добавьте ограничение на количество запросов в единицу времени, чтобы предотвратить перебор данных даже от администраторов:
python
@ratelimit(key=’user’, rate=’20/m’, method=’GET’)
def getByAdminParameters(self, request, nick=None, steam_id=None):
…
## Итоговые рекомендации
1. **Принцип наименьших привилегий** — метод доступен только роли `ADMIN` или выше.
2. **Аудит** — каждый вызов фиксируется в логах.
3. **Валидация** — входные данные проверяются до выполнения запроса.
4. **Обработка ошибок** — возвращайте обобщённые сообщения об ошибках, не раскрывая внутреннюю структуру.
5. **Тестирование** — пишите unit-тесты, проверяющие отказ в доступе для не-администраторов.
