Как пользователь входит в приложение couchapp, для которого определена роль читателя? - PullRequest
4 голосов
/ 12 сентября 2011

Я развернул свое приложение через Couchapp, что означает, что все приложение обслуживается из базы данных. Я не хочу, чтобы данные в базе данных Couchdb были общедоступными, поэтому я указал роль читателя, которую должен иметь пользователь, прежде чем я отправлю ему данные. Однако, когда я иду в приложение, все, что я могу получить, это:

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

Потому что он не может даже обслуживать страницу входа, которая использует jquery.couch.js.

Любые идеи о том, как обеспечить вход в приложение (т. Е. Вход в систему без использования Futon для пользователя, которому необходим доступ для чтения данных)?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

В настоящее время решение требует немного работы. (Сообщество оказывает давление, чтобы улучшить это, но я объясню настоящий ответ вместо того, чтобы описывать предложения или программный продукт.)

Создайте базу данных "Welcome mat" со следующими функциями:

  • Имеет администратора ("jtsnake"): _security.admins = {"names":["jtsnake"], "roles":[]}
  • Доступно для чтения: _security.readers = {"names":[], "roles":[]}}
  • Имеет проектный документ с функцией .validate_doc_update. Разрешить без изменений кроме как администратором:

    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);
    }
    
  • Наконец, поместите в эту базу данных ваше общедоступное содержимое, такое как экран приветствия, экран входа в систему и т. Д. Личные данные могут попадать в личную базу данных после входа пользователя в систему.

0 голосов
/ 05 мая 2014

Для конкретного случая, когда вы и люди, с которыми вы можете общаться напрямую только с пользователями этого приложения (например, с личными или внутренними вещами), быстрое решение, которое хорошо работает, - это букмарклет , который создает Форма входа пользователя, устанавливает сессию и обновляет страницу:

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 создайте закладку и используйте эту строку в качестве URL:

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

...