【发布时间】:2026-02-03 01:00:02
【问题描述】:
我正在使用 amazon s3 存储上传的用户图像。我的问题是:
- 如果我允许或受赠人,我将无法上传或下载内容。
- 如果我允许或授予所有人,所有用户和(尤其是)匿名用户都将能够看到我不希望的内容。
所以,我的问题是,我该怎么做才能只有我网站上的用户才能上传、下载和删除内容?
因为我有条件:
- 仅关注用户的用户(user1、user2、user3...) (user0) 可以下载/查看内容吗?
- 只有上传视图的用户才能删除内容。
models.py:
def get_upload_file_name(instance, filename):
return "uploaded_files/%s_%s" %(str(time()).replace('.','_'), filename)
PRIVACY = (
('H','Hide'),
('F','Followers'),
('A','All'),
)
class Status(models.Model):
body = models.TextField(max_length=200)
image = models.ImageField(blank=True, null=True, upload_to=get_upload_file_name)
privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
user = models.ForeignKey(User)
settings.py:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'FAKEAMAZONKEY'
AWS_SECRET_ACCESS_KEY = 'FAKEAMAZONSECRETKEY'
AWS_STORAGE_BUCKET_NAME = 'fakebucketname'
更新
用户关系模型
class Person(models.Model):
user = models.OneToOneField(User)
relationships = models.ManyToManyField('self', through='Relationship',
symmetrical=False,
related_name='related_to')
def __unicode__(self):
return self.user.username
def add_relationship(self, person, status):
relationship, created = Relationship.objects.get_or_create(
from_person=self,
to_person=person,
status=status)
return relationship
def remove_relationship(self, person, status):
Relationship.objects.filter(
from_person=self,
to_person=person,
status=status).delete()
return
def get_relationships(self, status):
return self.relationships.filter(
to_people__status=status,
to_people__from_person=self)
def get_related_to(self, status):
return self.related_to.filter(
from_people__status=status,
from_people__to_person=self)
def get_following(self):
return self.get_relationships(RELATIONSHIP_FOLLOWING)
def get_followers(self):
return self.get_related_to(RELATIONSHIP_FOLLOWING)
def get_friends(self):
return self.relationships.filter(
to_people__status=RELATIONSHIP_FOLLOWING,
to_people__from_person=self,
from_people__status=RELATIONSHIP_FOLLOWING,
from_people__to_person=self)
RELATIONSHIP_FOLLOWING = 1
RELATIONSHIP_BLOCKED = 2
RELATIONSHIP_STATUSES = (
(RELATIONSHIP_FOLLOWING, 'Following'),
(RELATIONSHIP_BLOCKED, 'Blocked'),
)
class Relationship(models.Model):
from_person = models.ForeignKey(Person, related_name='from_people')
to_person = models.ForeignKey(Person, related_name='to_people')
status = models.IntegerField(choices=RELATIONSHIP_STATUSES)
def __unicode__(self):
return "%s %s %s" % (self.from_person, self.get_status_display(), self.to_person)
class Activity(models.Model):
actor = models.ForeignKey(User)
action = models.CharField(max_length=100)
content_type = models.ForeignKey(ContentType, related_name="content_type")
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
element_type = models.ForeignKey(ContentType, related_name="element_type", blank=True, null=True)
element_id = models.PositiveIntegerField(blank=True, null=True)
element_object = generic.GenericForeignKey('element_type', 'element_id')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
class Meta:
verbose_name = 'Activity'
verbose_name_plural = 'Activities'
ordering = ['-pub_date']
def __unicode__(self):
return ("%s %s") % (self.actor.username, self.action)
def get_rendered_html(self, user=None):
if self.element_type:
template_name = '%s_activity.html' %(self.element_type.name)
else:
template_name = '%s_activity.html' %(self.content_type.name)
return render_to_string(template_name, {
'object':self.content_object,
'actor':self.actor,
'action':self.action,
'element_object':self.element_object,
'user':user,
'pub_date':self.pub_date
})
【问题讨论】:
-
您需要将您的 s3 权限更改为仅允许从您的服务器下载,并且后端 webapp 需要过滤掉可以向 s3 文件发出请求的人。我正在使用 symfony,所以帮不上什么忙。如果您不对 s3 添加限制,那么任何知道该链接的人都可以从 s3 下载该文件,这就是数据泄露。 Look at bucket policies
-
@George 是的,这就是我想要的。我已将您的评论添加为有用。我希望有人能帮助我。
-
我当然希望那些不是你真正的钥匙
-
它们不是...我做的第一件事是检查这些键是否有效。你可以想象有机器人在每个网站上抓取这样的密钥……亚马逊密钥特别容易抓取。
标签: django amazon-web-services amazon-s3 boto