如何实现AclServiceUtils.getAcl()以从lotusnotes中检索用户信息

时间:2016-03-30 05:28:09

标签: java lotus-notes opencmis

我试图找到一种获取Lotus Notes文档的完整用户列表的方法。 我无法获取用户并在openCMIS中显示他们的权限。

有谁知道如何获取特定文档的每个用户的完整ACL?

 public class AclServiceUtils {
 private static final Logger LOGGER = LoggerFactory.getLogger(AclServiceUtils.class);

public static Acl getAcl(Session session, String objectId, Boolean onlyBasicPermissions) throws IOException {


    ObjectIdentity objId = ObjectIdentity.getObjectIdentity(objectId);

    try {     
        AccessControlListImpl acl = new AccessControlListImpl();
        List<Ace> aces = new ArrayList<Ace>();

        PrincipalImpl principal=new  PrincipalImpl();

       principal.setId(objId.getType() + " ");
       // here we want info of user
            AccessControlEntryImpl ace = new AccessControlEntryImpl();
            ace.setDirect(true);
            ace.setPrincipal(principal);
            aces.add(ace);
          acl.setAces(aces);
        return acl;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

}

public class ObjectIdentity {
@JsonIgnore
private static final ObjectMapper mapper = new ObjectMapper();
@JsonIgnore
private static final String UTF_8 = "UTF-8";

private ObjectIdentityType type;
private String unid;
private String id;
private String parentFolderPath;

public ObjectIdentityType getType() {
    return type;
}

public void setType(ObjectIdentityType type) {
    this.type = type;
}

public String getUnid() {
    return unid;
}

public void setUnid(String unid) {
    this.unid = unid;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getParentFolderPath() {
    return parentFolderPath;
}

public void setParentFolderPath(String parentId) {
    this.parentFolderPath = parentId;
}

@JsonIgnore
public String getEncodedObjectId() throws IOException {
    String json = mapper.writeValueAsString(this);
    byte[] encodeBase64 = Base64.encode(json);
    String result = new String(encodeBase64);
    result = URLEncoder.encode(result, UTF_8);
    return result;
}

@JsonIgnore
public static ObjectIdentity getObjectIdentity(String encodedString)
        throws IOException {
    String decodedString = URLDecoder.decode(encodedString, UTF_8);
    byte[] decodeBase64 = Base64.decode(decodedString);
    String result = new String(decodeBase64);
    return mapper.readValue(result, ObjectIdentity.class);
}

public static void main(String args[]) throws IOException{
    ObjectIdentity identity = new ObjectIdentity();
    identity.setId("<1__=EABBF5CEDFB501988f9e8a93df93869091@local>");
    identity.setUnid("DEF");
    identity.setType(ObjectIdentityType.ATTACHMENT);


    ObjectIdentity decoded = ObjectIdentity.getObjectIdentity(identity.getEncodedObjectId());
    /*System.out.println(decoded.id);
    System.out.println(decoded.unid);
    System.out.println(decoded.type);*/

    System.out.println(decoded.id.equals(identity.id));

}

}

1 个答案:

答案 0 :(得分:1)

由于没有人回答,我将此视为与上述评论达成一致意见,因此我会将其作为答案提供。

可悲的是,答案是它并不容易 - 对可能的解决方案进行全面的技术处理超出了StackOverflow可以实现的范围。

Domino不是为了轻松回答问题而设计的。#34;谁是有权阅读或更新此文档的所有用户&#34;?回答这个问题并不容易。#34;现在有权访问此服务器上读取或更新此文档的所有用户是谁?&#34;要回答这个问题,您必须从有权访问服务器的所有用户列表开始,对于有权访问数据库的所有用户,将该组划分为这些组:读取访问权限少于那些组的用户,使用Reader,访问权限,具有作者访问权限的访问权限,以及具有“编辑者”访这需要咨询ACL并解析引用的一个或多个Domino目录中的任何组。然后你必须检查文档中的所有项目,以确定它们中是否有任何一个具有SUMMARY READ ACCESS或SUMMARY READ / WRITE ACCESS标志集,如果它们中的任何一个,你必须阅读名称列表,这可能是包括必须从ACL解析的角色,和/或从一个或多个Domino目录中解析的组。

我将在上面评论的内容中再添加一个内容。既然你提到你正在使用REST API,我认为尝试使用这种方法是不切实际的。如果我将此作为一项要求,我只会考虑使用Notes Java或C API的方法,如果交互使用需要这些信息,我可能会构建一个预先计算为的服务器加载项尽可能多的信息。