2013-03-06 70 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

相關問題