Пользователь CouchDB для записи / чтения (без редактирования) - PullRequest
0 голосов
/ 20 ноября 2018

Toolchain / рамка

Я использую 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(...)

Я понимаю, что я должен делать часть журналирования с использованием промежуточного программного обеспечения (которое я планирую) и, вероятно, просто использовать CreateView django, в этом случае, я делаю этот подход сейчас только на ранней стадии разработки.

У меня проблема с тем, чтобы обернуть голову вокруг создания пользователя с myusername и mypassword, который имеет права на:

  1. Написать новые документы
  2. Читать старые документы
  3. не редактировать уже созданные документы

Я мог бы согласиться только на 1 и 3 (и использовать только admin для чтения). Я потратил немного времени на игры с интерфейсом Fauxton для разрешений, но я могу только создать user и назначить role (даже не смог назначить пароль: /)

осветление

Asset - это не CouchDB документ, это обычная модель SQL, я хочу только вывести дампы с данными постов в CouchDB

Буду очень признателен за любую помощь / указатели / документацию

1 Ответ

0 голосов
/ 23 ноября 2018

Обзор

Couchdb имеет один переопределяющий уровень настройки администратора в конфигурации вместо настройки в базе данных _users и назначил разрешение _admin для предотвращениялюбая возможность быть заблокированной.

Каждая отдельная база данных имеет грубый уровень политика безопасности из двух уровней:

  1. admins
  2. участники

указывается через:

  1. имена
  2. ролей

, составляющих 4 поля.

Эти уровнинемного по-разному управлять доступом для двух типов документов, которые БД может содержать:

  1. id: _design/* - Документы проекта могут содержать функции, которые будут выполняться в некотором контексте
  2. id:other - Обычные документы - это просто обычные данные

Оба уровня доступа к базе данных имеют доступ на чтение ко всем документам в базе данных, но администраторы имеют доступ на запись к _design документам.Доступ на запись к обычным документам обычно предоставляется всем пользователям, которым предоставлен какой-либо доступ к БД, но может быть ограничен проверкой проектной документации .

Подводя итог

Процесс дляНастройка уникальной политики безопасности:

  1. При настройке _users ознакомьтесь с предоставленным документом проверки проекта как с потребителем.
  2. Настройка новой базы данных и ее базовой безопасности, предоставляющей пользователям доступ к элементам.
  3. Добавление конструкторского документа в новую базу данных с помощью функции проверки, которая ограничивает доступ для записи элементов.

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"
        ]
    }
}

3.Создайте новый проверенный проектный документ в новом db

. Как пользователь _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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...