Rest 使用上次登录数据库进行MarkLogic用户管理

Rest 使用上次登录数据库进行MarkLogic用户管理,rest,xquery,marklogic,user-management,marklogic-8,Rest,Xquery,Marklogic,User Management,Marklogic 8,我正在尝试在MarkLogic上管理LDAP身份验证用户。我希望能够检查每个用户的最后登录值。我想从REST界面执行此操作。但是,MarkLogic将只返回显示我的管理用户登录活动的文档。这在qconsole中也是如此。如果我浏览上次登录的内容源,将显示所有登录文档,我可以查看内容。我希望能够使用xquery和REST获取文档 xdmp:user-last-login(xdmp:user("myCurrentUser")) 返回: <last-login xmlns="http://ma

我正在尝试在MarkLogic上管理LDAP身份验证用户。我希望能够检查每个用户的最后登录值。我想从REST界面执行此操作。但是,MarkLogic将只返回显示我的管理用户登录活动的文档。这在qconsole中也是如此。如果我浏览上次登录的内容源,将显示所有登录文档,我可以查看内容。我希望能够使用xquery和REST获取文档

xdmp:user-last-login(xdmp:user("myCurrentUser"))
返回:

<last-login xmlns="http://marklogic.com/xdmp/last-login">
  <user-id>191939440856729280</user-id>
  <last-successful-login>2017-03-14T18:16:13Z</last-successful-login>
  <last-unsuccessful-login>
  </last-unsuccessful-login>
  <number-unsuccessful-logins>0</number-unsuccessful-logins>
  <display-last-login>true</display-last-login>
</last-login>
返回:

<last-login xmlns="http://marklogic.com/xdmp/last-login">
  <user-id>191939440856729280</user-id>
  <last-successful-login>2017-03-14T18:16:13Z</last-successful-login>
  <last-unsuccessful-login>
  </last-unsuccessful-login>
  <number-unsuccessful-logins>0</number-unsuccessful-logins>
  <display-last-login>true</display-last-login>
</last-login>
您的查询返回了一个空序列

我希望能够获取其他用户的上次登录值。我想监视谁没有使用我的群集,如果他们没有积极使用群集,则将其删除。这是最好的方法吗?有更好的办法吗?这在MarkLogic中是可能的吗

for i in (list of LDAP names)
do
    curl -s --anyauth --user myUser:$(cat pass) -X POST -i \
    -d "xquery=xquery version \"1.0-ml\";xdmp:user-last-login(xdmp:user(\""$i"\"))" \
    -H "Content-type: application/x-www-form-urlencoded" \
    "http://$(hostname):8000/v1/eval"
done

事实证明,我们的系统中列出了一个bug,表明
xdmp:user-last-login()
接受一个用户id参数,但返回当前用户的信息

作为一种解决方法,我建议写一个你想要的答案。大概是这样的:

xquery version "1.0-ml";

module namespace last = "http://marklogic.com/rest-api/resource/last-login";

declare namespace ll = "http://marklogic.com/xdmp/last-login";

declare option xdmp:mapping "false";

declare function last:get(
    $context as map:map,
    $params  as map:map
) as document-node()*
{
  let $user-id :=
    try {
      xdmp:user(map:get($params, "username"))
    } catch ($e) {
      if ($e/error:code = "SEC-USERDNE") then ()
      else xdmp:rethrow()
    }
  return
    if ($user-id) then (
      document {
        xdmp:invoke-function(
          function() {
            /ll:last-login[ll:user-id = $user-id]
          },
          map:entry("database", xdmp:database("Last-Login"))
        )
      }
    )
    else (
      map:put($context, "output-status", (400, "No such user"))
    )
};
这将签入上次登录的数据库。这是硬编码的,现在;调用
admin:appserver get last login
会更好

要部署:

$ curl --anyauth --user user:password -X PUT \
  -H "Content-type: application/xquery" -d@"./last.xqy" \
  "http://localhost:8000/LATEST/config/resources/last-login?method=get&get:username=xs:string"
并致电:

$ curl --anyauth --user admin:admin -X GET \
  "http://localhost:8000/LATEST/resources/last-login?rs:username=admin"

注意username参数前面的“rs:”,这是RESTAPI所必需的

重新阅读MarkLogic文档后,它看起来像是另一个bug。您正在运行什么版本的MarkLogic?我正在8.0-5.4和8.0-6上尝试此功能。这两个都是在CentOS 6.8上完全修补的。在上次登录数据库时,我已将词干搜索改为
basic
。App Services appserver为
last login
db分配了last login选项。我还尝试使用
cts:search(fn:doc(),xs:string(xdmp:user('differentUser'))
来实现这一点。这在qconsole上起作用。然而,我从curl只得到了200个响应,但没有数据
curl--anyauth--user admin:$(cat pass)-X POST-i-d“xquery=xquery version\'1.0-ml\”;cts:search(fn:doc(),xs:string(xdmp:user('${OTHER-user}'))“-H”内容类型:application/X-www-form-urlencoded”-H“Accept:multipart/mixed;boundary=boundary”http://localhost:8000/v1/eval"
将数据库参数添加到我的http:statement中得到了我想要的结果。我将这个
?database=Last Login
添加到这个:
-X POST-I-d“xquery=xquery version\'1.0-ml\”,cts:search(fn:doc(),xs:string(xdmp:user('${OTHER-‌​用户}'))“-H”内容类型:application/x-www-form-urlencoded“-H”接受:多部分/混合;边界=边界“”http://localhost:8000/v1/eval?database=Last-登录“