我通过Couchapp部署了我的应用程序,这意味着整个应用程序是从数据库中提供服务的。我不希望Couchdb数据库中的数据公开可用,因此我指定了一个读者角色,用户必须在向其提供数据之前拥有该角色。然而,当我进入应用程序时,我所能得到的是:
{"error":"unauthorized","reason":"You are not authorized to access this db."}
因为它甚至不能提供使用jquery.couch.js的登录页面。
关于如何提供应用内登录(即,登录不使用Futon的用户,需要数据读取访问)的任何想法?
此时,解决方案需要做一些工作。(社区中存在改进这一点的压力,但我将解释目前的答案,而不是描述提案或汽包。)
创建一个"welcome mat"数据库,具有以下特性:
- 有一个管理员用户("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); }
-
最后,将您的公共内容(如欢迎屏幕、登录屏幕等)放在此数据库中。用户登录后,私有数据可以进入私有数据库
对于您和您只能直接与此应用程序的用户交谈的特定情况(如个人或内部事务),一个快速有效的解决方案是使用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中,创建一个书签并使用此字符串作为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);};