2017-03-14 11 views
3

MarkLogic에서 LDAP 인증 사용자를 관리하려고합니다. 각 사용자의 Last-login 값을 확인할 수 있기를 원합니다. 나는 REST 인터페이스에서 이것을하고 싶다. 그러나 MarkLogic은 관리 사용자의 로그인 활동을 보여주는 문서 만 반환합니다. 이것은 qconsole에서도 마찬가지입니다. 내가 마지막 로그인 콘텐츠 소스를 탐색하면 모든 로그인 문서가 표시되고 내용을 볼 수 있습니다. 나는 xquery와 REST로 문서를 얻을 수 있기를 원한다.LastLogic 로그인 데이터베이스가있는 MarkLogic 사용자 관리

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> 

내가 (admin입니다) myCurrentUser와 다른 사용자가보고하려고하면, 내가 얻을 :

xdmp:user-last-login(xdmp:user("someOtherUser")) 

반환 :

당신의 쿼리가 빈 시퀀스를 반환했습니다.

someWithUser의 마지막 로그인 값을 얻을 수 있기를 바랍니다. 누가 클러스터를 사용하고 있지 않은지 모니터링하고 클러스터를 적극적으로 사용하지 않는 경우 클러스터를 제거하려고합니다. 이 작업을 수행하는 가장 좋은 방법입니까? 더 좋은 방법이 있습니까? 이것은 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 
+0

MarkLogic 설명서를 다시 읽은 후에는 ** ** 다른 ** 버그처럼 보입니다. https://docs.marklogic.com/xdmp:user-last-login – mikel

+0

실행중인 MarkLogic의 버전은 무엇입니까? –

+0

나는 이것을 8.0-5.4와 8.0-6에서 시도하고있다. 이 두 가지 모두 CentOS 6.8에서 완전히 패치되었습니다. Last-Login 데이터베이스에서 형태소 검색을 '기본'으로 바꿨습니다. App-Services appserver는 마지막 로그인 옵션이'Last-Login' db에 할당되어 있습니다. – mikel

답변

2

은 우리가 xdmp:user-last-login()는 사용자 ID 매개 변수를 나타내는 우리의 시스템에 나열된 버그가 밝혀하지만 현재 사용자에 대한 정보를 반환합니다.

해결 방법으로, 나는 당신이 찾고있는 것을 대답하는 REST extension을 쓰는 것이 좋습니다. 다음과 같은 내용 :

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" [email protected]"./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" 

주를 "RS :"는 REST API에서 필요한 사용자 이름 매개 변수 앞에있다.