2017-06-11 25 views
1

我正在尝试开发一个MarkLogic-9采用服务器端JavaScript和HTTP应用服务器的双层Web应用程序。我有一个提示输入用户名/密码的简单页面,并通过Ajax将GET请求发送到应用服务器(应用程序级别认证)。MarkLogic App Server自定义登录页面sessionID Cookie与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)时,我的浏览器会获得一个cookie和sessionID。然而,当我通过Ajax GET请求运行login.sjs时,我的浏览器没有得到任何cookie。我不知道这是否是问题,但我可能值得一提。

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

为了完整起见,这里是客户端js我使用Ajax调用登录。相当不言自明。如果登录成功,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文件,用户重置为“登录用户”的默认值。

在此先感谢。

回答

0

我建议你看看安全指南的Chapter 15

有一个使用Custom Login Pages的应用程序级别身份验证示例。

最后,IP-based login的示例不是您需要的示例,而是说明如何使用xdmp.Login从默认应用程序用户切换用户。

我认为,所有这些都包含在内(实际上并不多),您将能够回溯您的设置并重新使用它。

+0

我很抱歉,如果我只是密集,但我已经通读了该部分,并尝试了所有我能想到的,但我仍然无法弄清楚这一点。我会尽量做更明确的事情。在login.html调用login.sjs并成功登录后,它会重定向到homepage.html。当homepage.html调用homepage.sjs(或同一应用程序服务器上的任何其他.sjs文件)时,它会丢失用户登录并恢复为默认用户的事实(在我的情况中为Login-User) 。如何移动到另一个页面而不会丢失登录信息? –

+0

@AlecDaling,xdmp.login调用在MarkLogic中创建用户会话,并使用会话ID设置Cookie。确保它在页面调用之间传递。具有该会话ID的呼叫将在调用之前自动切换到适当的用户。 – grtjn

+0

注意:请记住,此类会话与特定主机绑定。如果您之间有负载平衡器,则需要使用粘滞会话。 – grtjn

0

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

Get and store cookie (from Set-Cookie) from an AJAX POST response

我必须包括在我的Ajax请求如下一行:

xhrFields: { withCredentials: true }, 

,因为如果你有一个通配符在您访问控制允许来源标题,这将抛出一个错误,我也不得不改变这一行:

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

这样:

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

现在我的浏览器收集饼干。