1

我正在尝试使用使用服务器端 JavaScript 和 HTTP 应用程序服务器的 MarkLogic-9 开发一个两层 Web 应用程序。我有一个简单的页面,提示输入用户名/密码并通过 Ajax 向应用服务器发送 GET 请求(应用程序级身份验证)。

我的 login.sjs 脚本:

//generate object with field names from Request params
var params ={}; //JSON parsed URL parameters
var field_names = xdmp.getRequestFieldNames().toArray();
for(var fname_idx in field_names){
  params[field_names[fname_idx]] = String(xdmp.quote(xdmp.getRequestField(String(field_names[fname_idx]))));
}
//get username and password from passed paramters
var username = params.username;
var password = params.password;
var ret = xdmp.login(username,password);

ret;
我已经对此进行了测试,并通过打印 xdmp.currentUser() 验证了它是否有效。

然后登录页面重定向到显示基本用户信息的主页。我的问题是,在客户端重定向到主页后,我无法弄清楚如何保留当前用户的会话。

应用服务器具有应用程序级别的身份验证和名为 Login-User 的默认用户,这是一个自定义用户,仅具有登录所需的权限 (xdmp:login)。应用服务器托管在 localhost:8601 上。我发现当我直接从浏览器运行 login.sjs 时(即输入 localhost:8601/login.sjs?username=test_user&password=test_password),我的浏览器会获取一个带有 sessionID 的 cookie。但是,当我通过 Ajax GET 请求运行 login.sjs 时,我的浏览器没有获得任何 cookie。我不知道这是否是问题,但我认为这可能值得一提。

我仍然是 MarkLogic 的新手,所以我可能会以完全错误的方式来解决这个问题。基本上,在重定向到新页面后如何继续单个用户的会话?我是否使用 cookie 来保存 sessionID?每次网站调用新的 .sjs 文件时,我是否应该将用户名和密码保存在本地存储中并登录?

为了完整起见,这里是我用来进行 Ajax 调用以登录的客户端 js。很不言自明。如果登录成功,login.sjs 文件只会返回 true/false。

function createLoginEar(){
$("#login-button").click(function(event){
    var un = $("#username").val();
    var pw = $("#password").val();
    if(un){
        params.username = $("#username").val();
    }
    if(pw){
        params.password = $("#password").val();
    }
    event.preventDefault(); //prevent form from clearing
    console.log("input entered");
    $.ajax({
        type: "GET",
        url: url,
        data: params,
        success: function(data){
            if(data == "true"){
                console.log("worked");
                window.location.href = "homepage.html";
            } else{
                invalidLogin();
            }
        },
        error: function(data){
            invalidLogin();
        }
    })
})

}

问题是一旦页面重定向到 homepage.html,似乎没有用户登录的记忆,当 homepage.html 调用任何 .sjs 文件时,用户重置为默认值,即“登录用户”。

提前致谢。

4

2 回答 2

0

问题是我的浏览器没有从登录中收集 cookie,因为我头顶有问题,但我在另一篇文章中找到了答案,所以这可能是重复的。

从 AJAX POST 响应中获取和存储 cookie(来自 Set-Cookie)

我只需要在我的 ajax 请求中包含以下行:

xhrFields: { withCredentials: true },

如果您的 Access-Control-Allow-Origin 标头中有通配符,这将引发错误,因此我还必须更改此行:

xdmp.addResponseHeader('Access-Control-Allow-Origin', '*');

对此:

xdmp.addResponseHeader('Access-Control-Allow-Origin', 'http://localhost:8010');

现在我的浏览器会收集 cookie。

于 2017-06-12T18:52:42.487 回答
0

我建议您查看安全指南的第 15 章。

有一个使用自定义登录页面的应用程序级身份验证示例。

最后,基于IP登录的示例不是您需要的,而是向您展示如何使用xdmp.Login从默认应用程序用户切换用户。

我认为,涵盖了所有这些内容(实际上并不多),您将能够回顾您的设置并重新工作。

于 2017-06-11T11:13:40.370 回答