Какие основные подходы к реализации авторизации в веб-приложениях на Python?

Ответ

Авторизацию важно не путать с аутентификацией:

  • Аутентификация (Authentication): Проверка, кем является пользователь (например, по логину и паролю).
  • Авторизация (Authorization): Проверка, имеет ли аутентифицированный пользователь право на выполнение определённого действия.

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

  1. RBAC (Role-Based Access Control): Доступ предоставляется на основе ролей (admin, user, guest). Это самый распространённый подход.
  2. ACL (Access Control Lists): Права доступа назначаются конкретным пользователям для конкретных объектов.
  3. ABAC (Attribute-Based Access Control): Более гибкая модель, где доступ определяется на основе атрибутов пользователя, объекта и окружения (например, время суток).

Практическая реализация:

Авторизация обычно выполняется после успешной аутентификации. Информация о ролях или правах пользователя часто хранится в JWT (JSON Web Token) или в серверной сессии.

Пример декоратора для проверки роли в Flask (с использованием JWT):

from functools import wraps
from flask import request, jsonify
import jwt

# Предполагается, что токен содержит payload вида {'user': 'test', 'role': 'admin'}
SECRET_KEY = 'your-secret-key'

def role_required(role_name):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            token = request.headers.get('Authorization')
            if not token:
                return jsonify({'message': 'Токен отсутствует'}), 401
            try:
                # Убираем 'Bearer '
                token = token.split()[1]
                payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
                # Проверяем наличие нужной роли
                if payload.get('role') != role_name:
                    return jsonify({'message': 'Недостаточно прав'}), 403
            except (jwt.ExpiredSignatureError, jwt.InvalidTokenError):
                return jsonify({'message': 'Невалидный токен'}), 401
            return f(*args, **kwargs)
        return decorated_function
    return decorator

@app.route('/admin/dashboard')
@role_required('admin')
def admin_dashboard():
    return 'Добро пожаловать в панель администратора!'

Современные фреймворки, такие как Django REST Framework (Permission Classes) и FastAPI (Dependencies), предоставляют встроенные и расширяемые инструменты для реализации этих моделей.