工具链/框架
我使用django==2.1.3和python-cloudant==2.1.3,运行CouchDB ver. 2.2.0,并且几乎通过Fauxton完成所有的设置/配置。我想我对python/django很了解,我正在一个小项目中测试这种方法,看看它是如何工作的。
问题描述
假设我有一个非常简单的CRUD应用程序,只有一个模型:
class Asset(models.Model):
asset_id = models.CharField(max_length=32)
asset_name = models.CharField(max_length=32)我有一个用来创建资产的视图
class CreateAssetView(views.View):
def get(self, request, *args, **kwargs):
#some code here
def post(self, request, *args, **kwargs):
#some code here|
#log request data into database
client = CouchDB('myusername', 'mypassword', url='http://127.0.0.1:5984', connect=True)
db = client['assets']
log_data = {'view_name': self.view_name, 'post_data': post_data,'user': request.user.username,
'time': str(timezone.now())}
db.create_document(log_data)
return render(...)我知道我应该使用中间件(我计划这样做)来完成日志记录部分,在这种情况下可能只使用django的CreateView,我现在只是在早期开发期间使用这种方法。
我有个问题,就是用myusername和mypassword创建一个具有以下权限的用户:
我甚至可以只满足于1和3(并且只使用管理员阅读)。我花了一点时间在Fauxton的界面上寻找权限,但我只能创建一个user并分配一个role (甚至不能分配密码:/)。
clarification
Asset不是一个CouchDB文档,这是一个普通的CouchDB模型,我只想将带有post数据的日志转储到CouchDB
任何帮助/引导/文档指针都是非常感谢的。
发布于 2018-11-23 20:39:59
概述
Couchdb有一个覆盖级别的配置中的管理员设置,而不是_users数据库,并分配了_admin权限,以防止任何被锁定的可能性。
然后,每个单独的数据库都有两个级别的粗略级别安全政策:
通过以下方式具体说明:
制作了4个字段。
对于数据库可以包含的两种类型的文档,这些级别控制访问的方式略有不同:
_design/* -设计文档可以包含将在某些上下文中执行的函数other -普通文档只是普通数据两个级别的数据库访问都具有对数据库中所有文档的读取访问权限,但管理员可以对_design文档进行写入访问。对普通文档的写入访问通常授予所有授予对数据库的任何访问权限的用户,但可以受到验证设计文档的限制。
总结
设置唯一安全策略的过程是:
1设置_users条目
向用户添加角色
当管理员将role: ["logger"]添加到用户的文档并保存它时,请注意,由于默认的_users设计文档的这一部分,管理员必须这样做:
// DB: _users doc: _design/_auth
function(newDoc, oldDoc, userCtx, secObj) {
..
if (oldRoles.length !== newRoles.length) {
throw({forbidden: 'Only _admin may edit roles'});
}更改用户的密码。
管理员或用户可以通过在文档中设置password:"mynewpassword"来更改密码(在保存过程中,couchdb将转换为哈希/咸密码)。这适用于用户,因为只要用户正在编辑他们自己的文档,他们就可以添加/修改字段(除了他们的名称和角色):
// DB: _users doc: _design/_auth
function(newDoc, oldDoc, userCtx, secObj) {
..
if (userCtx.name !== newDoc.name) {
throw({
forbidden: 'You may only update your own user document.'
});
}
// then checks that they don't modify roles您可以对分配给adminlogger角色的用户重复此过程,以创建指定权限的委托管理员,该管理员可以重新配置数据库,也可以继续将couchdb及其_admin角色用于所有管理。
2建立新数据库及其基本安全性
创建一个名为logger的db,为记录器分配一个安全政策
{
"admins": {
"names": [
],
"roles": [
"adminlogger"
]
},
"members": {
"names": [
],
"roles": [
"logger"
]
}
}3.在新数据库中创建一个新的验证设计文档
作为_admin用户或具有adminlogger角色的用户,通过复制_users设计文档、删除_rev和修改函数,创建一个新的验证设计文档:
// DB: logger doc: _design/auth
function(newDoc, oldDoc, userCtx, secObj) {
// Don't let non-admins write a pre-existing document:
if (!is_server_or_database_admin()) {
if (!!oldDoc) {
throw({
forbidden: 'You may not update existing documents.'
});
}
}
// Where the function to define admins can be copied verbatim from the doc:
var is_server_or_database_admin = function(userCtx, secObj) {
// see if the user is a server admin
if(userCtx.roles.indexOf('_admin') !== -1) {
return true; // a server admin
}
// see if the user a database admin specified by name
if(secObj && secObj.admins && secObj.admins.names) {
if(secObj.admins.names.indexOf(userCtx.name) !== -1) {
return true; // database admin
}
}
// see if the user a database admin specified by role
if(secObj && secObj.admins && secObj.admins.roles) {
var db_roles = secObj.admins.roles;
for(var idx = 0; idx < userCtx.roles.length; idx++) {
var user_role = userCtx.roles[idx];
if(db_roles.indexOf(user_role) !== -1) {
return true; // role matches!
}
}
}
return false; // default to no admin
}
} 如果遵循这些步骤,那么步骤1中指定的记录器角色的用户可以运行代码,只在步骤2和步骤3中配置的记录器数据库中编写新文档。
https://stackoverflow.com/questions/53384941
复制相似问题