1

我有以下注册用户的方法:

// Registration method
exports.register = function(req, res) {
    var username = req.body.username,
        password = req.body.password,
        first = req.body.first;
        last = req.body.last;
        role = req.body.institution;

    nano = require('nano')('http://127.0.0.1:5984');
    var users = nano.use('_users');

    var user = {
                    "_id": "org.couchdb.user:" + username,
                    "name": username,
                    "type": "user",
                    "roles": [],
                    "password": password,
                    "realname": first + " " + last
                };

    users.insert(user, function(err, body) {
        if(err) {
            res.send(err.reason, err.status_code);
        } else {
            res.send(body, 200);
        }
    });
};

如您所见,我有一个名为 role 的变量,我想在“roles”数组中设置它。不幸的是,您可能知道,CouchDB 只允许管理员设置角色。我对此没意见,但我将角色用作机构,所以我希望注册用户能够选择他们正在注册的机构,因此它应该自动为他们分配这个角色。如果没有将我的管理员凭据硬编码到此方法中,即 nano.config.url = "http://admin:password@127.0.0.1:5984/" 如何自动将新用户分配给他们指定的角色,正如我所提到的?

4

1 回答 1

3

CouchDB 使用角色数组来决定数据库授权。这允许您通过用户角色配置对给定数据库的访问。如果用户可以设置自己的角色,那么某人可以授予自己访问任何机构的权限。他们甚至可以让自己成为管理员,这违背了保护您的管理员密码的目的。

我不确定您的用例是什么,但我认为您并没有试图阻止访问其他机构。相反,我怀疑您正在尝试使用这些角色来执行一些其他应用程序功能(例如,为他们过滤信息以简化他们所看到的内容)。由于您想要执行非安全功能,我强烈建议您将自己的字段添加到用户文档中。您可以为每个用户添加一个institutions属性。


如果你真的想这样做,有办法。您收到的错误来自数据库中的更新验证功能。作为管理员,您可以更改此功能。_design/_auth_users

下载文件。打开文件并搜索Only _admin may edit roles以查看正在执行测试的位置。删除该条件并将文档保存回 CouchDB。

于 2013-03-09T04:28:33.357 回答