Skip to main content

用加密字符串替换 Rest Framework 的 IntegerField pk 或 id 查找。

项目描述

[![PyPI](https://img.shields.io/pypi/dm/django-rest-encrypted-lookup.svg)]()
[![构建状态](https://travis-ci.org/ InterSIS/django-rest-encrypted-lookup.svg?branch=master)](https://travis-ci.org/InterSIS/django-rest-encrypted-lookup)

django-rest-encrypted-lookup
===== ========

Drop-in ViewSets、Serializers 和 Fields 用加密字符串查找替换您的 IntegerField pk 或 id 查找。

在整个项目中使用单一密码,或为每个序列化程序、模型、用户和/或客户端提供唯一密码。

投票的 json 表示:
```
{
"id": 5,
"questions": [
2,
10,
12,
]
}
```
变为: ` `
`
{
"id": "4xoh7gja2mtvz3i47ywy5h6ouu",
"questions": [
"t6y4zo26vutj4xclh5hpy3sc5m",
"hp7c75ggggiwv6cs5zc4mpzeoe", "
rqq5a2evfokyo7tz74loiu3bcq",
]
}密码这样:``` #用户A获取/api/polls/并接收: { “results”:[ “4xoh7gja2mtvz3i47ywy5h6ouu”, “12gc75ggggiwv6cs5zc4mpzeoe”, ] }













# 用户 B 获取 /api/polls/ 并接收:

{
"results": [
"rqq5a2evfokyo7tz74loiu3bcq",
"hp7c75g84g63v6cs5zc423zeoe",
]
}
```


如果您更喜欢超链接相关字段:
```
{
"id": "4xoh7gja2mtvz3i47ywy5h6ouu",
“问题”:[
“https://example.com/api/questions/t6y4zo26vutj4xclh5hpy3sc5m/”、
“https://example.com/api/questions/hp7c75ggggiwv6cs5zc4mpzeoe/”、
“https://example.com/api/问题/rqq5a2evfokyo7tz74loiu3bcq/",
]
}
```

端点:

```
/api/polls/5/
```
变为:
```
/api/polls/4xoh7gja2mtvz3i47ywy5h6ouu/
```

加密查找*不*适合用作防止用户猜测对象 URI 的安全措施。加密
查找*适合用作混淆对象 pks/ids 的方法。


安装
===============

在 Python 发行版或 virtualenv 中安装模块:

$ pip install django-rest-encrypted-lookup

将应用程序添加到 `INSTALLED_APPS`:

```
INSTALLED_APPS = (
...
"rest_framework_encrypted_lookup",
...
)
```

在 settings.py 中:

```
ENCRYPTED_LOOKUP = {
'lookup_field_name': 'id', # 你的 drf 查找字段的字符串值名称,一般是 'id' 或 'pk'
'secret_key': 'uniquesecret', # 选择一个字符串值唯一的密钥加密你的查找字段
},
```

它是如何工作的
=============

加密的查找字符串*不*存储在与它们所代表的对象相关联的数据库中。
模型序列化程序在响应组合期间生成加密查找。端点
URI 中呈现的加密查找在调用调度时被解密,数据字段中呈现的加密查找由模型
反序列化器解密。

加密由 PyCrypto AES 库提供。

使用
===

django-rest-encrypted-lookup 提供了三个字段类:

from rest_framework_encrypted_lookup.fields import EncryptedLookupField、EncryptedLookupRelatedField、EncryptedLookupHyperlinkedRelatedField

两个新的序列化器类:

from rest_framework_encrypted_lookup.serializers import EncryptedLookupModelSerializer、EncryptedLookupHyperlinkedModelSerializer

和一个通用视图类:

from rest_framework_encrypted_lookup。 EncryptedLookupGenericViewSet

使用这些代替 Django Rest Framework 3 提供的类。

示例:

```
#models.py
...
class Poll(models.Model):
...


# serializers.py
...
class PollSerializer(EncryptedLookupModelSerializer):

class Meta:
model = Poll


# views.py
...
from rest_framework import viewsets

class PollViewSet(EncryptedLookupGenericViewSet,
viewsets.mixins.ListModelMixin,
viewsets.mixins.RetrieveModelMixin,
...
)

queryset = Poll.objects.all()
serializer_class = PollSerializer

lookup_field = 'id'
```

在此包中包含的类中,上面的示例使用了 `EncryptedLookupModelSerializer` 和
`EncryptedLookupGenericViewSet`。

`EncryptedLookupField`、`EncryptedLookupRelatedField` 字段被 EncryptedLookupModelSerializer 隐式使用
。如果需要,这些字段也可以显式使用。

我们可以使用 `EncryptedLookupHyperlinkedModelSerializer` 而不是 `EncryptedLookupModelSerializer`:
```
# serializers.py
...
class PollSerializer(EncryptedLookupHyperlinkedModelSerializer):

class Meta:
model = Poll
```

在这种情况下,PollSerializer 将使用 `EncryptedHyperlinkedLookupRelatedField` 将相关字段序列化为超链接。

默认情况下,每个加密查找序列化程序类都将使用相同的密码。
您可以通过覆盖序列化程序的 `get_cypher` 方法来选择非默认密码。

这是一个 `` ` get_cypher``` 方法,它将为每个模型生成 一个 唯一
的 密码 :(secret=encrypted_lookup_settings['secret_key']+self.Meta.model) ```











这是一个 `` ` get_cypher``` 方法,它将为每个用户生成 一个 唯一
的 密码 :假设用户必须登录才能到达此端点。 return IDCipher(secret=encrypted_lookup_settings['secret_key']+self._context["request"].user.username) ```兼容性============= * Django Rest Framework 3.0, 3.1 * Django 1.6、1.7、1.8 * Python 2.7、3.3、3.4



















有关测试的特定次要版本,请参见 tox.ini。

附加要求
========================

* PyCrypto 2.6.1

Todo
====

* 有用的例外。
* 覆盖范围。

参与
其中 =================

随意打开拉取请求或问题。GitHub 是该项目的规范位置。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django-rest-encrypted-lookup-0.10.1.tar.gz (21.0 kB 查看哈希)

已上传 source