用户如何登录定义了读者角色的couchapp?

时间:2011-09-12 14:21:29

标签: security couchdb couchapp

我通过Couchapp部署了我的应用程序,这意味着整个应用程序都是从数据库中提供的。我不希望Couchdb数据库中的数据公开可用,因此我在为数据服务之前指定了用户必须具有的读者角色。然而,当我去申请时,我所能得到的只有:

{"error":"unauthorized","reason":"You are not authorized to access this db."}

因为它甚至无法提供使用jquery.couch.js的登录页面。

有关如何提供应用内登录的任何想法(即,对于需要数据读取权限的用户,不使用Futon登录)?

2 个答案:

答案 0 :(得分:5)

此时,解决方案需要一些工作。 (社区有压力要改善这一点,但我会解释现在的答案,而不是描述提案或蒸发器。)

制作一个“欢迎垫”数据库,具有以下功能:

  • 有管理员用户(“jtsnake”):_security.admins = {"names":["jtsnake"], "roles":[]}
  • 公开阅读:_security.readers = {"names":[], "roles":[]}}
  • 具有.validate_doc_update功能的设计文档。除了admin:

    之外,允许无更改
    function(newDoc, oldDoc, userCtx, secObj) {
        // _design/welcome_mat .validate_doc_update
    
        if(! userCtx.name)
          throw {"unauthorized": "Please log in to change the welcome mat"};
        if(userCtx.roles.indexOf("_admin") === -1)
          throw {"forbidden": "Only the admin can change the welcome mat"};
        log("Allowing welcome mat update by: " + userCtx.name);
    }
    
  • 最后,将 public 内容(例如欢迎屏幕,登录屏幕等)放在此数据库中。一旦用户登录,私人数据就可以进入私人数据库。

答案 1 :(得分:0)

对于您和您可以直接与此应用程序的用户(例如个人或内部用户)交谈的特定情况,一个运行良好的快速解决方案是创建一个用于创建用户登录的bookmarklet表单,建立会话并刷新页面:

var form = '<div style="position: absolute; left: 50%; top: 50%; margin-left: -150px; margin-top: -100px; width:3 00px; height: 200px;">'
         + '  <form id="loginForm">'
         + '    <input placeholder="nome" name="name">'
         + '    <input placeholder="senha" type="password" name="password">'
         + '    <button onclick="login(event)">OK</button>'
         + '  </form>'
         + '</div>';

document.write(form);

function login(event) {
    event.preventDefault();
    event.returnValue = false;
    var form = document.getElementById('loginForm');
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            location.reload();
        }
    };
    xhr.open('POST', '/_session', true);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send('name=' + form.name.value + '&password=' + form.password.value);
};

我不了解其他浏览器,但在Chrome中,创建书签并使用此字符串作为网址:

javascript: var form = '<div style="position:absolute;left:50%;top:50%;margin-left:-150px;margin-top:-100px;width:300px;height:200px;"><form id="loginForm"><input placeholder="nome" name="name"><input placeholder="senha" type="password" name="password"><button onclick="login(event)">OK</button></form></div>';document.write(form);function login(event) { event.preventDefault(); event.returnValue = false; var form = document.getElementById('loginForm'); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { location.reload(); }}; xhr.open('POST', '/_session', true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send('name=' + form.name.value + '&password=' + form.password.value);};