You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Django从GCP Storage获取安全文件URL并仅限授权前端用户访问

Django + GCP 云存储安全文件访问解决方案

一、基础环境配置

首先安装依赖:

pip install django-storages google-cloud-storage

在Django的settings.py中配置GCP存储参数:

from google.oauth2 import service_account

# GCP存储桶配置
GS_BUCKET_NAME = '你的存储桶名称'
GS_PROJECT_ID = '你的GCP项目ID'
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
    '/path/to/你的服务账号密钥.json'
)
# 设置文件默认权限为私有
GS_DEFAULT_ACL = 'private'
# 替换默认文件存储后端
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'

二、上传阶段的权限绑定

定义关联用户的文件模型,确保文件归属清晰:

from django.db import models
from django.contrib.auth.models import User

class UserFile(models.Model):
    file = models.FileField(upload_to='user_files/')
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    uploaded_at = models.DateTimeField(auto_now_add=True)

前端上传文件时,通过Django接口关联到当前登录用户,确保文件存入GCP私有存储桶。

三、生成授权临时签名URL

编写视图校验用户权限,并生成带有效期的签名URL:

from django.http import JsonResponse
from django.contrib.auth.decorators import login_required
from google.cloud import storage
from django.conf import settings
from datetime import datetime, timedelta

@login_required
def get_file_url(request, file_id):
    try:
        # 校验用户是否为文件所有者
        user_file = UserFile.objects.get(id=file_id, owner=request.user)
        storage_client = storage.Client(credentials=settings.GS_CREDENTIALS, project=settings.GS_PROJECT_ID)
        bucket = storage_client.get_bucket(settings.GS_BUCKET_NAME)
        blob = bucket.blob(user_file.file.name)
        
        # 生成1小时有效期的签名URL
        signed_url = blob.generate_signed_url(
            version='v4',
            expiration=timedelta(hours=1),
            method='GET'
        )
        
        return JsonResponse({'file_url': signed_url})
    except UserFile.DoesNotExist:
        return JsonResponse({'error': '无访问权限或文件不存在'}, status=403)

四、前端访问逻辑

前端调用上述接口(如/api/get-file-url/<file_id>/)获取临时URL,直接使用该URL加载或下载文件即可。URL过期后需重新调用接口获取新的签名链接。

五、额外安全强化

  • 缩短签名有效期:根据业务场景调整expiration参数,比如设为15分钟,降低URL泄露风险。
  • 扩展权限范围:若需多用户共享文件,可添加shared_users多对多字段,视图中校验用户是否在所有者或共享列表内。
  • 访问日志:记录请求用户ID、文件ID和时间,便于排查异常访问。

内容的提问来源于stack exchange,提问作者Ayaz Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:34