2016-06-13 51 views
2

我在Xpages應用程序的頂部有一個導航欄。這個元素將被許多Xpage應用程序共享 - 它的工作方式類似於Xpage應用程序的內聯網。Xpages:確定用戶是否可以訪問數據庫

我不想將數據庫鏈接顯示給無權訪問數據庫的用戶。

如何確定用戶是否可以訪問數據庫?這是我應該以某種方式緩存,所以它不必一次又一次加載:

回答

3

您可以使用Database方法queryAccess(name)獲取單個用戶的ACL級別。然後,您可以檢查「禁止訪問」和存款人。下面是如果用戶訪問分貝返回true一個例子:

db.queryAccess(userName) != ACL.LEVEL_NOACCESS && db.queryAccess(userName) != ACL.LEVEL_DEPOSITOR 

我會建議你在用戶豆用戶緩存此。

3

每的建議是偉大的,但要注意在queryaccess一個限制:

從文檔:

如果指定在ACL中明確列出的名稱,queryAccess返回的訪問級別爲ACL輸入並且不檢查組。 如果您指定的名稱未在ACL中明確列出,queryAccess會檢查名稱是否是運行腳本的計算機已知的主地址簿中組的成員。在本地工作站上,該地址簿是個人通訊簿。在服務器上,該地址簿是Domino®Directory。如果queryAccess在一個或多個組中找到該名稱,它將返回這些組中的最高訪問級別。如果您指定的名稱未在ACL中單獨列出或作爲組的一部分列出,那麼queryAccess將返回ACL的默認訪問級別。

3

首先 - 如果代碼以用戶權限運行,則不能爲無法打開的數據庫調用queryAccess。要解決這個問題,你可以強制代碼使用簽名者的會話並獲得訪問權限。但是...

我推薦這樣做:製作一個名爲的hasAccess。關於範圍:

  • 應用範圍的用戶之間共享 - 無用
  • 會話範圍 - 相當不錯,但在ACL變化 的情況下,你需要重新啓動HTTP或等待會話超時
  • 視圖範圍建議
  • 請求範圍不會太大幫助

實現Map接口,這樣你就可以像#{hasAccess[database]}綁定它放在database會是文件路徑,還是查找數據庫的特殊鍵。根據用戶的訪問實現緩存並返回true/false。您如何確定用戶的訪問權限取決於您,但我認爲最好的方法是使用try/catch嘗試打開該數據庫並使用isOpen()進行檢查。

相關問題