pouchdb-аутентификация, как мне установить роли для нового пользователя - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу установить роли для нового пользователя.

Я пытался обновить массив ролей в метаданных во время регистрации, но получаю ошибку.Если я удаляю метаданные ролей, новый пользователь создается просто отлично.

db.signUp(userId, 'pass', {
    metadata: {
      email: 'robi434n@boywonder.com',
      birthday: '1932-03-27T00:00:00.000Z',
      likes: ['acrobatics', 'short pants', 'sidekickin\'']
      roles: ['basic']
    }
  }, function (err, response) {
    if (err) {
      if (err.name === 'conflict') {
        console.log('batman" already exists, choose another username')
        // "batman" already exists, choose another username
      } else if (err.name === 'forbidden') {
        console.log('invalid username')
        // invalid username
      } else {
        console.log('sign up error')
        // HTTP error, cosmic rays, etc.
      }
    } else {
      console.log('user signed up')
     // login()
    }
  })

Итак, я понял, что сначала нужно изменить код pouchdb-authentication-index.js для принятия ролей.

var signUp = pouchdbUtils.toPromise(function (username, password,roles, opts, callback) {
  var db = this;
  if (typeof callback === 'undefined') {
    callback = typeof opts === 'undefined' ? (typeof password === 'undefined' ?
      username : password) : opts;
    opts = {};
  }
  if (['http', 'https'].indexOf(db.type()) === -1) {
    return callback(new AuthError('This plugin only works for the http/https adapter. ' +
      'So you should use new PouchDB("http://mysi3te.org:5984/mydb") instead.'));
  } else if (!username) {
    return callback(new AuthError('You must provide a username'));
  } else if (!password) {
    return callback(new AuthError('You must provide a password'));
  }

  var userId = 'org.couchdb.user:' + username;
  var user = {
    name: username,
    password: password,
    roles: roles,
    type: 'user',
    _id: userId,
  };

  updateUser(db, user, opts, callback);
});

Затем вы можете отправить роли в регистрации.Я отправляю базовое ниже

   signUp()
function signUp () {
  db.signUp(userId, 'pass', ['basic'], {
    metadata: {
      email: 'robi434n@boywonder.com',
      birthday: '1932-03-27T00:00:00.000Z',
      likes: ['acrobatics', 'short pants', 'sidekickin\'']
    }
  }, function (err, response) {
    if (err) {
      if (err.name === 'conflict') {
        console.log('batman" already exists, choose another username')
        // "batman" already exists, choose another username
      } else if (err.name === 'forbidden') {
        console.log('invalid username', err)
        // invalid username
      } else {
        console.log('sign up error', err)
        // HTTP error, cosmic rays, etc.
      }
    } else {
      console.log('user signed up', err)
      login()
    }
  })
}

, теперь вам нужно перейти на базу данных couchdb _user _design / _auth, изменить документ

else if (newDoc.roles.length > 0 ) {\n 

и установить

else if (newDoc.roles.length > 0 && newDoc.roles[0] !== 'basic' ) {\n

Теперь у вас будет базовый уровень в вашей сессии, и вы можете добавить больше ролей, немного подправив код.Это позволяет мне легко устанавливать разрешения для роли члена, чтобы ограничить доступ к другим базам данных.Или более простое решение, которое я нашел и протестировал, - добавить новый документ по дизайну в вашу базу данных с помощью следующего кода.Это позволит только пользователям, которые вошли в систему, доступ к вашей базе данных

{
  "_id": "_design/usersOnly",
  "_rev": "17-6fb7e6c0ccfca8b2e56738ad63e26107",
  "language": "javascript",
  "validate_doc_update": "\n  function(newDoc, oldDoc, userCtx){   \n // check if user is logged in \n  if(!userCtx.name){ throw({forbidden : 'No way.. login man!'});}   \n //reqired fields to update \n  function require(field){   var message = field + ' is required';  if(!newDoc[field]){  throw({'forbidden':message})  }}   require('name');                                         }"
}

1 Ответ

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

В документации по проверке функции в качестве основного примера используется документ проекта _users:

Пример. В ddoc _design / _auth из базы данных _users используется функция проверки, чтобы гарантировать, чтодокументы содержат некоторые обязательные поля и могут быть изменены только пользователем с ролью _admin:

        ...
        } else if (newDoc.roles.length > 0) {
            throw({forbidden: 'Only _admin may set roles'});
        }
        ...

Например, в fauxton вы можете войти в систему как пользователь couchdb admin и перейти в базу данных _users и изменитьдизайн (на свой страх и риск), например:

        } else if (newDoc.roles.length > 0 && !("basic" === newRoles[0] && newDoc.roles.length === 1)) {
            throw({forbidden: 'Only _admin may set roles'});
        }  

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

С таким изменением новым пользователям разрешается создавать couchdb с основной ролью, поэтомуВаш клиентский код работает, если он правильно устанавливает роли.В pouchdb-authenticate это выглядит как opt.roles , а не opt.metadata.roles, то есть:

db.signUp(userId, 'pass', {
    metadata: {
      email: 'robi434n@boywonder.com',
      birthday: '1932-03-27T00:00:00.000Z',
      likes: ['acrobatics', 'short pants', 'sidekickin\'']
    },
    roles: ['basic'] }, ... )
...