用加密字符串替换 Rest Framework 的 IntegerField pk 或 id 查找。
项目描述
[]()
[](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 是该项目的规范位置。
[](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 是该项目的规范位置。