Ответ
Авторизацию важно не путать с аутентификацией:
- Аутентификация (Authentication): Проверка, кем является пользователь (например, по логину и паролю).
- Авторизация (Authorization): Проверка, имеет ли аутентифицированный пользователь право на выполнение определённого действия.
Основные модели авторизации:
- RBAC (Role-Based Access Control): Доступ предоставляется на основе ролей (
admin
,user
,guest
). Это самый распространённый подход. - ACL (Access Control Lists): Права доступа назначаются конкретным пользователям для конкретных объектов.
- 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
), предоставляют встроенные и расширяемые инструменты для реализации этих моделей.