Sobes.tech
Назад к вопросам
Junior — Middle
42

Как вы реализуете процессы проверки личности и предоставления доступа в системах?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что проверка личности и выдача доступа разделяются на два этапа: аутентификация и авторизация. Важно описать, как обеспечивается безопасность: пароли не хранятся в открытом виде, используются токены, роли и проверки прав. Также ожидают понимание, как строится отказоустойчивая и удобная для сопровождения схема доступа.

Определение:

Проверка личности — это подтверждение того, что пользователь действительно тот, за кого себя выдаёт. Обычно это аутентификация по паролю, OTP, SSO, OAuth/OpenID Connect или по сертификату.

Предоставление доступа — это решение, к каким ресурсам и операциям пользователь может обращаться после успешной аутентификации. Это уже авторизация: роли, права, группы, политики доступа и проверки на уровне API, сервиса или объекта.

Пример использования:

В веб-приложении пользователь вводит логин и пароль, сервер проверяет хэш пароля в базе, а затем выдаёт JWT или сессию. После этого каждый запрос к защищённым эндпоинтам проходит проверку токена и прав пользователя.

from dataclasses import dataclass

@dataclass
class User:
    username: str
    role: str
    password_hash: str

def authenticate(username: str, password: str, users: list[User]) -> User | None:
    # Упрощённо: в реальности сравнивают хэш пароля с использованием bcrypt/argon2
    for user in users:
        if user.username == username and password == "secret":
            return user
    return None

def authorize(user: User, action: str) -> bool:
    permissions = {
        "admin": {"read", "write", "delete"},
        "manager": {"read", "write"},
        "viewer": {"read"},
    }
    return action in permissions.get(user.role, set())

users = [User("alice", "admin", "hash1"), User("bob", "viewer", "hash2")]

user = authenticate("alice", "secret", users)
if user and authorize(user, "delete"):
    print("Access granted")
else:
    print("Access denied")

Пояснение кода:

Код показывает базовую схему из двух шагов. Сначала функция authenticate() ищет пользователя и подтверждает его личность; в реальной системе вместо сравнения с "secret" используется проверка хэша пароля. Затем authorize() проверяет роль пользователя и сопоставляет ей набор разрешённых действий.

Пример демонстрирует, что даже после успешного входа доступ к операции может быть запрещён. Это и есть разделение аутентификации и авторизации.

Ключевые моменты:

  • Аутентификация подтверждает личность, авторизация определяет права.
  • Пароли нельзя хранить в открытом виде; используются хэширование и соль.
  • Для доступа часто применяют роли, группы или политики на уровне ресурсов.
  • Токены или сессии помогают не проверять логин и пароль на каждом запросе.
  • Проверки прав должны быть на сервере, а не только в UI.
  • Важно учитывать отзыв доступа, истечение токена и аудит действий пользователя.