【问题标题】:pouchdb-authentication how do I set roles for a new userpouchdb-authentication 如何为新用户设置角色
【发布时间】:2019-04-24 03:18:04
【问题描述】:

我想为新用户设置角色。

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

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,那么我认为你应该限制用户添加角色的列表,以防止roles = ["basic","delegatedadminrole"] 稍后咬你,并允许任何免费用户角色订购。
  • 我认为您不需要更改 pouchdb-authentication 并更新我的答案..
  • 我会添加长度 > 1。非常感谢您的帮助!!

标签: couchdb pouchdb


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的帖子帮了大忙。我会更新我最终是如何做到的
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多