🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ دانشجوی سون‌لرن
دسترسی به فایل‌های media
جامعه پایتون (وب) ایجاد شده در ۰۲ شهریور ۱۴۰۲

اگر فایل‌های media رو مثل فایل‌های static آدرس دهی کنیم هر کاربری میتونه به اون مدیا دسترسی داشته باشه. چطور میشه این دسترسی رو کنترل کرد؟

سلام وقتتون بخیر

برای کنترل دسترسی به فایل‌های Media در Django، میتونید از مفهوم حقوق دسترسی (permissions) و روش‌های دیگری استفاده کنید:

۱. مفهوم حقوق دسترسی (Permissions):

from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_image = models.ImageField(upload_to='profile_images/')
  class Meta:
    permissions = [
      ("can_view_profile_images", "Can view profile images"),
    ]
### OR
from django.db import models
from django.contrib.auth.models import User
class File(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    file_name = models.CharField(max_length=255)
    file = models.FileField(upload_to='files/')
    class Meta:
        permissions = [
            ("can_access_file", "Can access the file"),
        ]
# In a view:
if request.user.has_perm('your_app.can_access_file'):
    # Access to the file is granted
    # Perform operations related to file access
else:
    # Access to the file is not possible
# In a template:
{% if user.has_perm 'your_app.can_access_file' %}
    
{% else %}
    
{% endif %}



  بعدش میتونید در ویوها یا تمپلیت‌ها، از دستوراتی مثل `user.has_perm('app_name.can_view_profile_images')` استفاده کنید تا بررسی بشه که آیا کاربر مجوز دسترسی به تصاویر پروفایل داره یا خیر.


۲. استفاده از Middleware:

  میتونید از Middleware درخواست‌ها به دایرکتوری Media را کنترل کنید و تصمیم بگیرید که کدام درخواست‌ها به فایل‌های Media اجازه دسترسی دارن و کدومشون ندارن. برای این کار، میتونید یک کلاس Middleware تعریف کنید.

from django.http import HttpResponseForbidden
class MediaAccessMiddleware:
  def __init__(self, get_response):
    self.get_response = get_response
  def __call__(self, request):
    response = self.get_response(request)
    return self.process_response(request, response)
  def process_response(self, request, response):

    # چک کردن آیا درخواست به یک فایل Media اشتراکی اشاره دارد

    if request.path.startswith('/media/'):

      # چک کردن آیا کاربر لاگین شده است

      if request.user.is_authenticated:

        # چک کردن آیا کاربر مالک فایل است یا نه

        if request.user.username in request.path:
          return response

      # اگر دسترسی ندارد، پیام خطا ارسال می‌شود

      return HttpResponseForbidden("Access denied to this media file")
    return response

بعد middleware رو به تنظیمات اضافه کنید

# settings.py
MIDDLEWARE = [
    # ...'myapp.middleware.MediaAccessMiddleware',  # ...
]

هر دو روش بالا میتونن بسته به نیاز‌های پروژه‌ی شما انجام بشن. انتخاب هر کدام از روش‌ها به اینکه مدل معماری شما و نیازهای امنیتی شما چی باشه بستگی داره

بهترین پاسخ
Reza Mobaraki ۰۲ شهریور ۱۴۰۲، ۰۷:۴۹