Как в Python реализовать авторизацию, то есть проверку прав доступа?

«Как в Python реализовать авторизацию, то есть проверку прав доступа?» — вопрос из категории Безопасность, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

  • Аутентификация: Кто вы? (Проверка личности)
  • Авторизация: Что вам можно делать? (Проверка прав)

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

  1. Управление доступом на основе ролей (Role-Based Access Control, RBAC) Это самый распространенный подход. Пользователям назначаются роли (например, admin, editor, viewer), а разрешения привязываются к ролям.

    Пример с помощью декоратора в Flask:

    from functools import wraps
    from flask import request, abort, g
    
    def requires_role(role):
        def decorator(f):
            @wraps(f)
            def decorated_function(*args, **kwargs):
                # Предполагается, что информация о пользователе и его роли
                # уже загружена после аутентификации и доступна в `g.user`
                if not g.user or g.user.role != role:
                    abort(403)  # Forbidden
                return f(*args, **kwargs)
            return decorated_function
        return decorator
    
    @app.route('/admin/dashboard')
    @login_required # Сначала аутентификация
    @requires_role('admin') # Затем авторизация
    def admin_dashboard():
        return "Welcome, Admin!"
  2. Управление доступом на основе атрибутов (Attribute-Based Access Control, ABAC) Более гибкий подход, где решение о доступе принимается на основе атрибутов пользователя, запрашиваемого ресурса и окружения (например, время суток, IP-адрес).

Готовые решения в фреймворках:

  • Django: Имеет мощную встроенную систему аутентификации и авторизации с пользователями, группами и разрешениями (permissions).
  • Flask: Используются расширения, например, Flask-Principal или Flask-Security-Too, для реализации сложных схем авторизации.
  • FastAPI: Авторизация часто реализуется с помощью зависимостей (dependencies), которые проверяют права доступа на основе данных из JWT-токена или другого источника.