Ответ
Аутентификация (Authentication) и авторизация (Authorization) — это последовательные этапы контроля доступа, часто обозначаемые как AuthN и AuthZ.
-
Аутентификация (AuthN) — "Кто ты?"
- Это процесс верификации личности пользователя или системы.
- Проверяет предоставленные учетные данные (credential) против хранилища данных (например, базы пользователей).
- Примеры механизмов: Логин/пароль, одноразовые коды (TOTP), аппаратные ключи (YubiKey), биометрия, сертификаты.
- Результат успешной аутентификации — установление идентификатора (user ID, principal).
-
Авторизация (AuthZ) — "Что тебе разрешено?"
- Это процесс проверки прав доступа уже аутентифицированного субъекта к конкретному ресурсу или действию.
- Определяет, какие операции (чтение, запись, удаление) пользователь может выполнять с объектом (файлом, endpoint, записью в БД).
- Примеры моделей: Ролевой доступ (RBAC), доступ на основе атрибутов (ABAC), списки контроля доступа (ACL).
Аналогия: Представьте себе офисное здание.
- Аутентификация — это предъявление пропуска охране (сканирование карты) для подтверждения, что вы сотрудник компании.
- Авторизация — это определение, в какой конкретный кабинет (например, серверную) ваш пропуск дает вам доступ после того, как вы вошли в здание.
Пример кода (упрощенный):
# 1. Аутентификация: Проверяем, кто пользователь
def authenticate(username, password_hash):
user = db.get_user(username)
if user and user.password_hash == password_hash:
return user.id # Возвращаем идентификатор
return None
# 2. Авторизация: Проверяем, что пользователь может делать
def authorize(user_id, action, resource):
user_role = db.get_user_role(user_id)
# Проверяем права на основе роли (RBAC)
if action == "DELETE" and user_role != "ADMIN":
return False # Отказать в доступе
if resource == "SALARY_DATA" and user_role not in ["HR", "ADMIN"]:
return False
return True # Разрешить доступ
# Использование
user_id = authenticate("alice", "hashed_password123")
if user_id and authorize(user_id, "VIEW", "PROJECT_REPORT"):
show_report() Ответ 18+ 🔞
А, ну вот, опять эти два слова, которые все путают, как хуй с пальцем! Слушай, давай разберёмся, а то голова болит уже от этих «авсентификаций».
Представь себе, ты подходишь к двери какого-нибудь офиса, где сидят важные пидоры в пиджаках. Первое, что ты делаешь — аутентификация (AuthN). Это когда тебя спрашивают: «Ты кто, блядь?». Ты суёшь им свою карточку, палец к сканеру, или, на худой конец, говоришь пароль. Они смотрят в свою базу данных и говорят: «А, так это ты, Вася Пупкин! Ну заходи, Вася». Всё, твоя личность установлена. Это и есть ответ на вопрос «Кто ты?».
А теперь ты внутри. И начинается авторизация (AuthZ). Это когда тебе говорят: «Так, Вася, а что тебе тут можно?». Ты такой: «Хочу в серверную». А они тебе: «А хуй тебе, Вася! У тебя роль „Бухгалтер“, а в серверную только „Админ“ или „Сисадмин с пониженной социальной ответственностью“. Иди-ка ты лучше в бухгалтерию кофе пить». Вот это и есть проверка прав, или «Что тебе разрешено?».
Короче, чтобы было совсем понятно:
- AuthN — это когда ты доказываешь, что ты не верблюд.
- AuthZ — это когда тебе говорят, что верблюдам в этот холодильник с пивом нельзя, даже если они очень хотят.
Вот, смотри, как это в коде выглядит, чтоб ты не думал, что я пизжу:
# 1. Аутентификация: Узнаём, кто пришёл (или кто приперся)
def authenticate(username, password_hash):
user = db.get_user(username)
# Сравниваем хеш пароля. Если совпало — это наш чел.
if user and user.password_hash == password_hash:
return user.id # Возвращаем его внутренний ID, типа "да, это Вася №1488"
return None # Не сошлось — иди нахуй, незнакомец.
# 2. Авторизация: Проверяем, куда этому челу можно
def authorize(user_id, action, resource):
user_role = db.get_user_role(user_id) # Смотрим, кто он по жизни
# А теперь правила, ёпта! Простая модель RBAC.
if action == "DELETE" and user_role != "ADMIN":
return False # Удалять может только админ! Ты чё, охренел?
if resource == "SALARY_DATA" and user_role not in ["HR", "ADMIN"]:
return False # Зарплаты смотреть? А тебе зачем, любопытная жопа?
return True # Ну ладно, проходи, всё можно.
# А теперь применяем эту хуйню на практике
user_id = authenticate("alice", "hashed_password123") # Алиса представилась
if user_id and authorize(user_id, "VIEW", "PROJECT_REPORT"): # Проверили, можно ли ей смотреть отчёт
show_report() # Можно! Показываем.
Вот и вся магия. Сначала узнаём, кто, а потом решаем, что этому «кто» можно. Не перепутай, а то получится ебушки-воробушки: пустишь кого попало в базу зарплат, а потом будешь чесать репу.