Как вы реализуете процессы проверки личности и предоставления доступа в системах?
Ответ от нейросети
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.
- Важно учитывать отзыв доступа, истечение токена и аудит действий пользователя.