Обзор
Couchdb имеет один переопределяющий уровень настройки администратора в конфигурации вместо настройки в базе данных _users
и назначил разрешение _admin
для предотвращениялюбая возможность быть заблокированной.
Каждая отдельная база данных имеет грубый уровень политика безопасности из двух уровней:
- admins
- участники
указывается через:
- имена
- ролей
, составляющих 4 поля.
Эти уровнинемного по-разному управлять доступом для двух типов документов, которые БД может содержать:
- id:
_design/*
- Документы проекта могут содержать функции, которые будут выполняться в некотором контексте - id:
other
- Обычные документы - это просто обычные данные
Оба уровня доступа к базе данных имеют доступ на чтение ко всем документам в базе данных, но администраторы имеют доступ на запись к _design документам.Доступ на запись к обычным документам обычно предоставляется всем пользователям, которым предоставлен какой-либо доступ к БД, но может быть ограничен проверкой проектной документации .
Подводя итог
Процесс дляНастройка уникальной политики безопасности:
- При настройке _users ознакомьтесь с предоставленным документом проверки проекта как с потребителем.
- Настройка новой базы данных и ее базовой безопасности, предоставляющей пользователям доступ к элементам.
- Добавление конструкторского документа в новую базу данных с помощью функции проверки, которая ограничивает доступ для записи элементов.
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, назначить регистратору политику безопасности :
{
"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.