def requires_permission(permission):
def decorator(func):
def wrapper(*args, **kwargs):
# Проверка прав доступа пользователя
if has_permission(get_current_user(), permission):
return func(*args, **kwargs)
else:
return "Доступ запрещен" # Или перенаправление
return wrapper
return decorator
@requires_permission("edit_posts")
def edit_post(post_id):
# Логика редактирования поста
return "Пост успешно отредактирован"
Декоратор для проверки прав доступа позволяет элегантно и многократно использовать логику проверки доступа к различным функциям или классам в приложении. Вот как это работает:
Основная идея:
Пример кода:
def requires_permission(permission):
"""Декоратор, проверяющий наличие указанного права доступа."""
def decorator(func):
def wrapper(*args, **kwargs):
# Получаем пользователя (например, из сессии, запроса, и т.д.)
user = get_current_user()
if user and user.has_permission(permission):
# У пользователя есть необходимые права, выполняем функцию
return func(*args, **kwargs)
else:
# У пользователя нет прав, возвращаем ошибку
return "У вас нет прав доступа для выполнения этой операции."
# Или можно выбросить исключение:
# raise PermissionDenied("У вас нет прав доступа.")
return wrapper
return decorator
# Вспомогательная функция для получения текущего пользователя (пример)
def get_current_user():
# Здесь должна быть логика получения пользователя из вашего контекста (например, сессии, запроса)
# Возвращаем объект пользователя или None, если пользователь не аутентифицирован.
# Это заглушка, нужно адаптировать под вашу систему аутентификации.
return None # Пример: возвращаем None, если пользователь не аутентифицирован
class User:
def __init__(self, role):
self.role = role
def has_permission(self, permission):
# Проверяем, есть ли у пользователя право доступа
if permission == "admin" and self.role == "admin":
return True
return False
# Пример использования декоратора
@requires_permission("admin")
def admin_only_function():
return "Функция доступна только администраторам."
#Пример создания объекта пользователя (для тестов)
user1 = User("admin")
def get_current_user():
return user1
print(admin_only_function()) # Выведет "Функция доступна только администраторам."
user2 = User("user")
def get_current_user():
return user2
print(admin_only_function()) # Выведет "У вас нет прав доступа для выполнения этой операции."
Объяснение:
requires_permission(permission)
- это декоратор, который принимает право доступа (например, "read", "write", "admin") в качестве аргумента.get_current_user()
- это фиктивная функция, которая должна возвращать объект текущего пользователя. В реальном приложении это может быть, например, получение пользователя из сессии, базы данных или JWT токена. Важно, что эта функция должна соответствовать вашей системе аутентификации.user.has_permission(permission)
- это метод объекта пользователя, который проверяет, имеет ли пользователь указанное право доступа. В реальном приложении это может включать проверку ролей пользователя, членства в группах, наличие определенных разрешений и т.д.@requires_permission("admin")
- применяет декоратор к функции admin_only_function()
. Теперь, когда вызывается admin_only_function()
, сначала будет выполнена обертка, которая проверит права доступа.Преимущества использования декораторов для проверки прав доступа:
@requires_permission
.Важные моменты:
В заключение, декораторы - мощный инструмент для реализации проверки прав доступа в приложениях Python, обеспечивающий чистый, читаемый и поддерживаемый код.