在数据库中为帐户创建条目之前,如何处理图像上传?

时间:2019-03-22 18:16:39

标签: django vue.js amazon-s3 django-rest-framework vuex

我正在构建一个单页应用程序。

在客户端,我正在使用 Nuxt.js (其中包括 Vue.js Vuex )。

要向服务器发送和接收数据,请使用 axios

API是使用 Django REST框架构建的。

我有以下情况:


enter image description here


如果用户要注册,他将从第1页开始。 在这里,他可以上传个人资料图片。他选择了图片后,就会自动将其上传到S3存储桶中。

在上传过程中或上传之后,他可以填写其他字段名字姓氏。 所有这些字段都临时保存在Vuex存储中,这意味着如果用户重新加载页面,则数据将消失。

如果他单击下一页,他将被带到另一个页面(另一个URL;不重新加载页面->单页应用程序),在那里他可以输入剩余数据。

点击按钮创建帐户后,将在数据库中创建条目。

现在是我的问题...我应该如何处理图像上传? 如前所述,图片应在选择后直接上传,而不仅是单击按钮创建帐户

在某些时候,我必须在图片和帐户之间建立一种关系。

到目前为止,我已经提出了以下解决方案。以下ER模型代表了我的数据库表。


enter image description here


如果用户在第1页上选择了一张图片,则该图片会立即上传到S3存储桶中,然后会在“图片”表中创建一个条目。

API返回此图像条目的ID。我将此ID保存在临时Vuex商店中,因此可以在第2页上使用它,将其发送到负责帐户创建的API端点。

问题在于,Vuex商店不是“安全的”,因为经验丰富的用户可以通过控制台轻松地编辑值。因此,他可以将图像条目的ID更改为根本没有创建的条目。

有没有人知道如何解决类似的问题,或者在创建帐户之前是否普遍使用这种方法来处理图片上传?

(我已经在很多页面上看到了这种情况,但是我不知道他们是如何解决的)

1 个答案:

答案 0 :(得分:2)

最好的方法是添加另一个唯一字段,并使用类似uuid的东西并将其用于代替id,至少用于注册或接受id不够安全的任何地方。或临时或其他无法公开访问或轻易猜到的东西。

您还可以过滤出没有所有者的图像并接受这些ID,这虽然不太安全,但是在同一确切时间有人获得另一个没有所有者的ID的机会非常低。 (如果您不定期清除图像而没有所有者,则为OFC)

另外,您应该担心以下事实:用户可能会在第2页处停止,并且图像中没有所有者(多余的空间)。如果您在“图像”表中具有该关系,则可以添加一个任务,使其每24小时运行一次,并删除没有所有者的图像,或者从创建之日起经过X分钟等的图像。

基本上在任何时候您都需要将单个表格分开以分隔步骤时,最终都会添加一些功能来进行清理。