我的Xpages应用程序顶部有一个导航栏。这个元素将在许多Xpage应用程序之间共享 - 它有点像我们的Xpage应用程序的内部网。
我不希望向无权访问数据库的用户显示数据库链接。
如何确定用户是否可以访问数据库?这是我应该以某种方式缓存的东西,所以它不必一次又一次地加载:
答案 0 :(得分:3)
您可以使用Database
方法queryAccess(name)
获取单个用户的ACL级别。然后,您可以检查无访问权限和存款人。这是一个示例,如果用户有权访问db:
db.queryAccess(userName) != ACL.LEVEL_NOACCESS && db.queryAccess(userName) != ACL.LEVEL_DEPOSITOR
我建议你在用户bean中为用户缓存它。
答案 1 :(得分:3)
Per的建议很棒,但要注意queryaccess的一个限制:
来自文档:
如果您指定的名称在ACL中明确列出,则queryAccess将返回该ACL条目的访问级别,但不会检查这些组。 如果您指定的名称未在ACL中明确列出,则queryAccess将检查该名称是否是运行该脚本的计算机所知的主通讯簿中的组的成员。在本地工作站上,该通讯簿是个人通讯簿。在服务器上,该通讯簿是Domino®目录。如果queryAccess在一个或多个组中找到该名称,则会返回这些组中的最高访问级别。如果您指定的名称未单独或作为组的一部分列在ACL中,则queryAccess将返回ACL的默认访问级别。
答案 2 :(得分:3)
首先 - 如果代码在用户权限下运行,则无法为无法打开的数据库调用queryAccess
。要解决此问题,您可以强制代码使用签名者的会话并获取访问权限。但...
我建议这样做:创建一个名为 hasAccess 的bean。关于范围:
实现map接口,因此你可以像#{hasAccess[database]}
那样绑定它,其中database
将是文件路径,或者一些特殊的键来查找数据库。根据用户的访问权限实现缓存并返回true / false。您如何确定用户的访问权限取决于您,但我认为最好的方法是使用try / catch尝试打开该数据库并使用isOpen()进行检查。