pouchdb-authentication如何为新用户设置角色

时间:2018-11-21 14:14:25

标签: couchdb pouchdb

我想为新用户设置角色。

我在注册期间尝试更新元数据中的角色数组,但出现错误。如果删除角色元数据,就可以创建新用户。

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()
    }
  })
}

现在您必须去榻榻米_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 :(得分:0)

validate function design documentation使用_users设计文档作为主要示例:

  

示例:_users数据库中的_design / _auth ddoc使用验证功能来确保文档包含一些必填字段,并且仅由具有_admin角色的用户修改:

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

例如,在fauxton中,您可以以benchdb管理员用户身份登录并转到_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'] }, ... )