我正在使用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
,而现在我只是在早期开发期间就采用这种方法。 / p>
我遇到了一个麻烦,就是用myusername
和mypassword
创建一个具有以下权限的用户:
我什至只能满足于1和3(并且只能使用admin来阅读)。我花了一些时间来试用Fauxton
的权限界面,但是我基本上只能创建一个user
并分配一个role
(甚至无法分配一个密码:/)
说明
Asset
不是CouchDB
文档,这是普通的SQL模型,我只想将包含发布数据的日志转储到CouchDB
任何帮助/指导/文档指针将不胜感激
答案 0 :(得分:1)
Couchdb具有一个administrator setup in configuration而不是setup in the _users
数据库的覆盖级别,并分配了_admin
权限以防止被锁定的可能性。
每个单独的数据库的粗糙级别security policy分为2个级别:
通过以下方式指定:
制作4个字段。
对于数据库可以包含的两种文档类型,这些级别对访问的控制稍有不同:
_design/*
-设计文档可以包含将在某些情况下执行的功能other
-普通文档只是普通数据两个级别的数据库访问都具有对数据库中所有文档的读取访问权限,但是管理员对_design文档具有写访问权限。通常,对授予对数据库有任何访问权限的所有用户都具有对普通文档的写访问权限,但可以受validate design documents的限制。
设置唯一安全策略的过程为:
作为管理员,将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"
来更改密码(在保存过程中,该ouchdb将转换为哈希/加盐的密码)。这对用户有效,因为他们可以在名称和角色之外添加/修改字段,只要用户正在编辑自己的文档即可:
// 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
角色的用户重复此过程,以创建委派的管理员,您可以为其分配权限以重新配置数据库,或者可以继续使用其长沙发管理员_admin
所有管理的角色。
创建一个名为logger的数据库 为记录器分配一个security policy:
{
"admins": {
"names": [
],
"roles": [
"adminlogger"
]
},
"members": {
"names": [
],
"roles": [
"logger"
]
}
}
以_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中配置的记录器数据库中写入新文档。