【问题标题】:Web user is not authorized to access a database despite having Editor access in the ACL尽管在 ACL 中具有编辑者访问权限,但 Web 用户无权访问数据库
【发布时间】:2015-02-12 10:55:48
【问题描述】:

在我的 XPages 应用程序中,网络用户可以执行自行注册。在注册过程中,会在地址簿中为网络用户创建一个用户文档,并将用户添加到对数据库具有编辑者访问权限的组中。在 Domino 服务器上执行show nlcache reset 后,用户可以登录并访问应用程序。

在大约 98% 的注册中,这非常好。但是,有时新用户在登录后无法进入应用程序,因为根据 Domino 服务器,他们“无权访问”数据库。登录必须有效,因为用户 ID 是正确的。完全相同的用户 ID 也可以在对数据库具有编辑权限的组的成员字段中找到。为了额外验证用户的访问级别,我使用用户 ID 执行了NotesDatabase.queryAccess()。它返回 0,这是 ACL 默认值,意思是“No Access”。然而,同一个ACL组中有几十个用户访问数据库完全没有问题。

目前,我们通过手动从通讯录中删除用户的文档以及将他/她从 ACL 组的成员中删除来“规避”这个问题。之后,我们要求用户使用与以前完全相同的信息重新进行自我注册。到目前为止,第二次注册一直有效,用户可以访问该应用程序。然而,这不是一个真正的解决方案,这就是为什么我不得不问是否有人知道可能是什么问题?

【问题讨论】:

  • 检查自注册用户的名字中是否有两个连续的空格,(可能是因为尾随空格也是)在组 domino 中执行 FullTrim。所以我们有 JohnSmith 不在组 XXX 中,因为在成员中是 JohnSmith。
  • @EmmanuelGleizer:用户名看起来很正常:没有前导或尾随空格,没有双空格。此外,到目前为止,使用完全相同的凭据进行的第二次注册一直有效。你有过类似的问题吗?
  • 您在代码中使用 sessionAsSigner 吗?
  • @ThomasAdrian:是的,我使用 sessionAsSignerWithFullAccess 能够在通讯簿中创建用户文档。您认为这会导致问题吗?
  • 听起来很熟悉:www-10.lotus.com/ldd/nd8forum.nsf/… 它链接到 Bruce Elgort 的博客,指出如果您设置 notes.ini 参数“NLCACHE_VERSION=4”,则无需“显示 nlcache 重置” - 这是自 8.5 以来的默认设置。 x (www-01.ibm.com/support/docview.wss?uid=swg21406274)。那么有访问问题的用户有什么特别之处吗?

标签: xpages lotus-notes acl lotus-domino


【解决方案1】:

不要直接在通讯录中创建条目。使用 adminp 进程进行注册。为了最大限度地减少感知延迟,发送用户必须单击的验证/确认消息。

【讨论】:

  • 感谢您的建议。
【解决方案2】:

2015 年 2 月 12 日的评论似乎是正确答案:

检查自注册用户的名字中是否有两个连续的空格,(可能是因为尾随空格)

在多米诺骨牌组中做一个 FullTrim。所以我们有

John<space><space>Smith

这不在组 XXX 中,因为在成员中:

John<space>Smith.

【讨论】:

    【解决方案3】:

    这可能与 names.nsf 中视图索引的刷新频率有关

    由于在 ACL 中对组进行了访问控制,因此只有在视图索引更新后,服务器才会“知道”哪个用户属于哪个组。 在正常情况下,这可能需要几分钟。

    您可以通过强制刷新索引来测试此假设,或者使用 Notes 客户端的 CTRL-MAJ-F9(警告,可能需要很长时间,具体取决于网络和 names.nsf 中的条目数)或使用命令

    load updall -v names.nsf
    

    ...或者让用户稍等片刻,然后在 5 分钟后重试。

    【讨论】:

    • 感谢您的回答。下次我们有错误的注册时,我会尝试你的命令。顺便说一句:这(可能)不是用户创建以来经过的时间问题。登录问题持续数小时。通常我们会在 12 小时内解决问题,所以我不能说更长的时间范围。
    • 好的,所以视图索引刷新率可能不是问题。我能想到的其他提示如下。
    • 现在,整个“自我注册过程”听起来像是一项自定义工作,因此您的错误很可能是自定义错误。你有能力和时间来彻底审查这个东西的设计吗?它是否保留任何类型的日志记录?说到日志,你检查过 log.nsf 和 domlog.nsf 吗?您可以调整 http 和服务器任务的日志级别。记下问题的具体表现。
    • 新用户是否有可能最终属于多个组,其中一个组的 ACL 级别较低?任何字符集问题?直接在数据库的 ACL 框中检查有效访问,将为您提供 NotesDatabase.queryAccess() 方法的更详细信息。顺便说一句,它是“那个”数据库吗?您的应用程序是否有可能使用多个数据库?如果您(管理员)手动重新创建目录条目并将所述条目插入相关组,而不是让用户再次完成注册过程,会发生什么?
    • 检查 admin4.nsf ,大致了解管理进程的方式。检查应用程序 acl 的相关部分。正如其他人提到的那样,通过对管理进程的请求而不是直接在 names.nsf 中写入任何复制问题来处理用户的自动创建总是更好、更安全?最后,如果我理解正确,任何请求它的人都会自动获得对应用程序的访问权限,那么为什么不通过 ACL 的“默认”条目来处理呢?组的意义何在?
    【解决方案4】:

    好的,首先是一个问题。如果您让用户等待几分钟,那么访问会起作用吗? IE。是刷新/缓存问题 - 还是您将用户添加到组的方式不一致?

    我假设用户名的格式是正确的,因为它在大多数情况下都有效(即完全分层的名称)......对于不起作用的名称有什么“特殊”吗?

    我做了类似的事情(并且已经做过好几次了)——尽管有一些不同:-)

    我通常使用目录服务将我的数据库包含在“($Users)”视图中。当我更新此视图中的任何内容时,我会在视图上执行 view.refresh()(使用 Java)。我通常不在这些类型的应用程序中使用组(要么不适用,要么我为特定用户使用 OU 或角色)。我不确定组成员身份是如何计算的 - 但我想您可以尝试找到相关视图(尽管当我查看时它们似乎都不明显) - 并对其进行刷新。

    /约翰

    【讨论】:

    • 这似乎不是刷新/缓存问题,因为即使等待数小时后,用户的访问级别也不会改变。此外,与错误注册相关的用户名也不是特殊的。如果我不知道如何解决这个问题,我会尝试使用 Directory Assistence 的方法。感谢您的提示。
    • 好吧,这真的很棒!然后您将名称添加到组的方式有问题。检查所有位置的名称是否正确(即分层名称)......
    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2022-08-16
    • 2019-11-24
    • 1970-01-01
    • 2016-01-29
    • 2023-04-03
    相关资源
    最近更新 更多