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

Ответ

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

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

  • Аутентификация (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)