2013-03-06 72 views
1

我有注册用户下面的方法:如何自动将角色分配给CouchDB用户?

// 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); 
     } 
    }); 
}; 

正如你所看到的,我有我想的“角色”阵列中设置一个变量叫做作用。不幸的是,你可能知道,CouchDB只允许管理员设置角色。我对此没有问题,但是我将这些角色当作机构使用,所以我希望注册用户能够选择他们正在注册的机构,因此它应该自动将这些角色分配给他们。没有将我的管理凭据硬编码到此方法中,即 nano.config.url = "http://admin:[email protected]:5984/" 如我所述,如何自动将新用户分配给他们指定的角色?

回答

3

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

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


如果你真的要做到这一点,有一种方法。您收到的错误来自_users数据库中的_design/_auth中的update validation function。作为管理员,您可以更改此功能。

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

+0

谢谢!你是对的,这是一个非安全功能。我认为我会很聪明并且使用角色而不是添加自己的领域,但是你解释它的方式是有道理的。谢谢! – 2013-03-10 02:44:56

相关问题