【问题标题】:Setting the ACL when creating a new database via JS in XPages在 XPages 中通过 JS 创建新数据库时设置 ACL
【发布时间】:2014-05-23 06:58:45
【问题描述】:

我正在使用 JS 从操作按钮创建一个新数据库。以下顺序发生:

  • 创建数据库时,-default- 访问权限设置为 Manager,这是必须的。
  • 然后我创建了几个 aclEntries。为当前用户创建的第一个条目,并将其设置为人员类型并具有管理员权限
  • 然后我创建了几个其他具有不同权限的条目并保存 ACL。

如果我打开 Db,ACL 看起来并正确运行,但 -default- 的访问级别为 Manager。

所以我尝试更改我的代码以通过各种方式将 -default- 的访问级别设置为 Author,all 导致异常:

  • 将 -default- 更改为 Author 并保存
  • 先如上保存ACL,然后修改-default-项并保存
  • 使用var newACL = db.getACL()新建ACL对象,更改并尝试保存

它似乎不承认我是 ACL 中的经理。

问:如何更改管理器的 -default- 访问权限?

【问题讨论】:

    标签: xpages xpages-ssjs


    【解决方案1】:

    获得良好的默认 ACL 的最简单方法可能是使用模板数据库。模板中方括号中的所有条目都将作为 ACL 条目复制到新数据库中。

    所以在你的模板中你会有

    • [-Default-]=Author[Anonymous]=No Access 导致
    • -Default-=AuthorAnonymous=No Access 在新数据库中

    更新 看起来更容易。您需要确保输入正确...
    使用这个功能:

    function makeDB(dbName) {
       var server = database.getServer();
       var you = @UserName();
       var dbDir = session.getDbDirectory(server);
       var db = dbDir.createDatabase(dbName);
       var acl = db.getACL();
       acl.createACLEntry(you,6);
       if (server != "" && server != you) {
          acl.createACLEntry(server,6);
       }   
       var def = acl.getEntry("-Default-");
       def.setLevel(3);
       acl.save();
    }
    

    然后你调用函数使用:

    makeDB("someFancyDBName");
    

    在函数中,我们确保运行脚本的您和运行脚本的服务器都作为管理员在 ACL 中(包括本地数据库的情况,在 Notes 客户端中服务器是空的,而在web preview 将是您的用户名)。

    像魅力一样工作。如果它不适合您,有几件事需要检查:

    • 它是否在本地工作(不涉及服务器)?
    • 控制台是否有错误?
    • 您在服务器中的访问级别是什么ECL
    • 检查数据库的“最大 Internet 访问权限”

    上一个答案(已过时):

    除此之外,它有点棘手......

    您创建新数据库:

       var db:Database = [... whatever you have todo here ...];
       var acl:Acl = db.getAcl();
       // Do whatever you do, don't touch -Default-
       acl.save();
       acl.recycle();
       var dbURL = db.getUrl(); // <-- off my head might be slightly different name
       db.recycle();
    
       // Now the real work
       var db2 = session.evaluate(dbUrl);
       var acl2 = db2.getAcl();
    
       // Change default here;
    

    从我的脑海中输入,包含拼写错误。

    这应该可以。告诉我们进展如何

    【讨论】:

    • 问题是在这种情况下使用模板真的行不通。我需要直接使用 ACL。我刚刚尝试了另一种选择。将自己添加为具有管理员权限的 ACL 条目后,我保存了 ACL 和 db.recycle。然后我打开数据库 var newDB = etc. 并检索显示默认值的 ACL 和我自己作为经理。我将 -default- 更改为 Author 并尝试保存 ACL,但它再次失败。如果我注释掉代码以将 -default- 更改为 author 一切都按我的预期工作,但将数据库留给 -default- = Manager,我无法将其留在。
    • 我添加了 vars acl aclEntry 和 DB 的回收,然后
    • 我添加了 vars acl aclEntry 和 DB 的回收,然后 var DB2:NotesDatabase = dir.openDatabase(filePath + fileName); var acl2:NotesACL = targetDB2.getACL(); var aclEntry2:NotesACLEntry = acl2.getEntry("-default-");然后设置 aclEntry2.setLevel(3) 加上一些其他条目 - 这些似乎都有效,直到我尝试 acl2.save() 并且它失败并且我得到一个异常错误。通过 dbURL 打开 Db 不起作用,但我认为这是我的服务器的问题,因为我之前在这台服务器上尝试过但它没有工作,但是将数据库打开到新的 var 应该做同样的事情。
    • 你需要解决URL问题。很可能连接文档可以帮助您(或短名称的主机/DNS 条目)
    • 这就像一个魅力。我将服务器的条目添加到我现有的代码中,一切都很完美。因此,即使我具有管理员访问权限,它也没有任何区别,它需要服务器具有管理员访问权限。我猜是因为它正在运行 SSJS,所以它使用服务器 ID 运行,并且具有服务器访问权限。首先,它从默认值获取管理员权限,如果 ACL 中没有服务器的显式条目,那么您不能更改默认值,因为 ACL 中将没有管理员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2016-08-04
    • 2016-06-22
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多