Что такое авторизация в контексте веб-приложений

Ответ

Авторизация — это процесс определения и предоставления прав доступа к ресурсам. Она отвечает на вопрос "Что разрешено делать этому пользователю?" и всегда следует за аутентификацией, которая отвечает на вопрос "Кто этот пользователь?".

Ключевое различие:

  • Аутентификация (Authentication): Проверка личности. Вы вводите логин и пароль, система подтверждает, что вы — это вы.
  • Авторизация (Authorization): Проверка прав. После входа система определяет, можете ли вы, например, удалять посты или только просматривать их.

Распространенные модели авторизации:

  1. RBAC (Role-Based Access Control): Доступ определяется на основе ролей (администратор, модератор, пользователь). Это самая популярная модель из-за своей простоты.
  2. ABAC (Attribute-Based Access Control): Доступ определяется на основе атрибутов пользователя, ресурса и окружения (например, разрешить доступ только в рабочее время).

Пример реализации в Python с помощью декоратора:

from functools import wraps

# Упрощенная модель пользователя
class User:
    def __init__(self, username, roles):
        self.username = username
        self.roles = roles

# Предположим, это функция, получающая текущего пользователя
def get_current_user():
    # В реальном приложении здесь будет логика извлечения пользователя из сессии или токена
    return User(username='admin_user', roles=['admin', 'editor'])

def requires_role(required_role):
    """Декоратор для проверки, есть ли у пользователя нужная роль."""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            current_user = get_current_user()
            if required_role not in current_user.roles:
                # В веб-приложении здесь был бы возврат HTTP 403 Forbidden
                raise PermissionError(f"Доступ запрещен. Требуется роль: {required_role}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@requires_role('admin')
def delete_sensitive_data():
    print("Конфиденциальные данные успешно удалены.")

# Вызов функции
try:
    delete_sensitive_data()
except PermissionError as e:
    print(e)

Ответ 18+ 🔞

А, слушай, вот это тема, про которую все так любят пиздеть, но половина нихуя не отличает одно от другого. Авторизация, блядь. Это когда ты уже влез в систему, типа доказал, что ты — это ты (это аутентификация, ёпта), а теперь система тебе говорит: «Ну окей, ты Вася, а что тебе, Васе, можно-то, блядь?»

Ключевое различие, чтобы не быть мудаком:

  • Аутентификация: «Кто ты такой, сука?» — «Я Вася!» — «Докажи!» — показывает паспорт (логин/пароль). Впустили.
  • Авторизация: «А, Вася. Ну заходи. Но в шкаф с оружием тебе, Вася, нихуя нельзя. А на кухню — пожалуйста, жри пельмени». Вот это и есть проверка прав.

Как это обычно устроено, блядь:

  1. RBAC (Ролевой доступ): Самый простой, как три копейки. Ты не «Вася», ты «админ», «модератор» или «пиздюк обычный». И в зависимости от этого тебе открывают двери. Популярно, потому что мозги не ебёт.
  2. ABAC (На основе атрибутов): Вот тут уже веселее. Тут смотрят не только кто ты, но и что ты, где ты и какое сейчас время. «Вася, ты можешь зайти в этот раздел, но только если ты из офиса и сейчас рабочий день, а не в три часа ночи из Таиланда». Хуйня мощная, но и мозг выносит конкретно.

Вот смотри, как на Python это может выглядеть, если делать по-простому, через декоратор:

from functools import wraps

# Упрощенная модель пользователя
class User:
    def __init__(self, username, roles):
        self.username = username
        self.roles = roles

# Предположим, это функция, получающая текущего пользователя
def get_current_user():
    # В реальном приложении здесь будет логика извлечения пользователя из сессии или токена
    return User(username='admin_user', roles=['admin', 'editor'])

def requires_role(required_role):
    """Декоратор для проверки, есть ли у пользователя нужная роль."""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            current_user = get_current_user()
            if required_role not in current_user.roles:
                # В веб-приложении здесь был бы возврат HTTP 403 Forbidden
                raise PermissionError(f"Доступ запрещен. Требуется роль: {required_role}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@requires_role('admin')
def delete_sensitive_data():
    print("Конфиденциальные данные успешно удалены.")

# Вызов функции
try:
    delete_sensitive_data()
except PermissionError as e:
    print(e)

Вот и вся магия, ёпта. Навесил декоратор @requires_role('admin') на функцию — и теперь её вызовет только тот, у кого в ролях есть этот самый «admin». А если попробует какой-нибудь «пользователь» — получит по ебалу с PermissionError. Красота, в рот меня чих-пых! Главное — не перепутай, где кого проверяешь, а то получится пиздец, а не безопасность.