【发布时间】: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。非常感谢您的帮助!!