使用aws s3+cloudfront为django提供安全存储

djamazing的Python项目详细描述


djazing[d__me_z_]提供了一种使用s3+cloudfront作为django存储的方法。它有 与传统存储相比,它可以生成签名的url,因此只有 能够显示url的用户也能够访问它。DJ惊人 可以在两种模式下工作:

unprotected mode
In this mode the storage simply generates URL-s to cloudfront. The cloudfront distribution should be publicly accessible. This can be used for files that don’t require special security.
protected mode
The URLs are signed in this model using the ^{tt1}$. These signatures are only valid for the current user. Please remember that it is up to the developer to ensure that the signed URLs are created only when the user that can access them is logged in (some kind of per-row authorization should probably be in place). After clicking these a special view redirects the user to a signed cloudfront URL. This URL is only valid for a very small amount of time.

AWS配置

  1. 创建一个s3 bucket。
  2. 为可以访问bucket的用户生成密钥对。
  3. 创建一个源于bucket的cloudfront分发 仅限于已签名的URL。
  4. (对于保护模式)生成可在中使用的CloudFront密钥对
    分布。

安装

  1. 安装djazing by pip:

    $ pip install djamazing
    

    注意:如果你使用django 1.10的djazing 未发布的django threadlocals版本

    $ pip install git+https://github.com/nebstrebor/django-threadlocals.git
    
  2. "djamazing.storage.DjamazingStorage"设置为默认的文件存储。

  3. 配置DJamazing:

    DJAMAZING = {
        'CLOUDFRONT_KEY': b"""-----BEGIN RSA PRIVATE KEY-----
    (...)
    -----END RSA PRIVATE KEY-----""",
        'CLOUDFRONT_KEY_ID': '...',
        'CLOUDFRONT_URL': 'http://....cloudfront.net/',
        'S3_KEY_ID': '...',
        'S3_SECRET_KEY': '...',
        'S3_BUCKET': '...',
        'SIGNATURE_TIMEOUT': datetime.timedelta(seconds=2),
    }
    

    对于无保护模式,省略CLOUDFRONT_KEYCLOUDFRONT_KEY_ID 钥匙。 如果要在文件^{tt5}中存储cloudfornt密钥$ 参数也可以用于文件路径。 请注意,签名超时是不需要任何人工操作的时间 交互时,只需浏览器来处理重定向。如果未指定-它 默认为1.5秒。

  4. 添加threadlocals中间件 'threadlocals.middleware.ThreadLocalMiddleware'到您的MIDDLEWARE

  5. urls.py

    url(r'^djamazing/', include(djamazing.urls)),
    

在一个项目中使用各种配置

如果要在一个项目中使用各种配置(例如 静态文件和保护上传),您可以使用继承。创建一个 DjamazingStoragelike的简单子类:

class StaticStorage(DjamazingStorage):
    """Storage for static files"""

    def __init__(self):
        super(StaticStorage, self).__init__(settings.STATIC_DJAMAZING)

现在您可以将其用作存储空间,如:

STATICFILES_STORAGE = 'some.path.StaticStorage'
STATIC_DJAMAZING = { ... }

STATIC_DJAMAZING配置将重写DJAMAZING 此存储的配置。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用JPA从1自动生成id?   java JSONException:CourseVide没有值   在Java中使用身份和访问管理   java观察者设计如何访问方法。调用范围?   试图从Java源代码调用JavaScript函数   java How to Fix无法解析Android中的方法“setContentView”   java如何从非结构化日志文件中提取json字符串?   将java布尔结果转换为字符串值   java无法调试servlet Eclipse+Glassfish   java是检查布尔值数组是否包含true的最快方法   java JFrame不会显示在ubuntu上   面向Web应用的javascript图像编辑   使用Hadoop自定义数据类型biginsghts时出现java EOF异常   选择尽可能多的非重叠段时超出了java时间限制   从Firebase获取数据列表并在不同活动/片段中共享的java最佳实践   使用SimpleCursorAdapter时出现java空指针异常   java以升序将元素插入到多链接列表中   支持TDD的java Eclipse插件   客户端无法从Java代码向服务器发送命令