簡體   English   中英

如何在 Apache Sling 的 OSGI 服務調用中判斷用戶的身份?

[英]How to tell the identity of a user in an OSGI service call in Apache Sling?

在 Apache Sling 中:如果您有一個多租戶設置或一個用戶可以部署他們自己的代碼(例如 JSP 或實際的 Java/Groovy 代碼或諸如此類的)的環境:有沒有辦法確定發送當前信息的用戶的身份?從被調用的 OSGI 服務中請求? 它必須能夠抵御惡意代碼。

背景:通常依靠JCR 權限來保護用戶不應該看到的內容就足夠了。 但有時您希望 OSGI 服務使用服務用戶訪問服務實現所需的 JCR 資源的內部內容,但您不希望該用戶有權訪問這些內容。 在這里,您可能有某種防篡改方法來識別用戶,以便檢查他對服務的權限。

有些事情顯然是行不通的。

  • 您可以將用戶 ResourceResolver 作為參數傳遞給 OSGI 服務的調用,並檢查 ResourceResolver.getUserId() 返回的內容。 這可以很容易地通過傳入一個包裝器來破壞,該包裝器委托給原始的 ResourceResolver 但在這里為 getUserId() 返回任意的東西。
  • 可以將用戶 ResourceResolver 作為參數傳遞給服務,並檢查用戶對資源樹中某個路徑的訪問權限,並設置 JCR 權限來保護該路徑。 不幸的是,這並不像聽起來那么容易:惡意代碼可以再次傳遞一個包裝器,該包裝器返回此路徑的模擬資源,模擬訪問。 我認為這可行的唯一方法是用戶必須對該路徑進行寫訪問,並且服務用戶用於檢查這是否被實際修改。 但由於性能和其他原因,這不是一個好方法。

你還有其他可能實際可行的想法嗎? 非常感謝!

注意:我知道這里還有其他攻擊你必須阻止(例如使用反射侵入 OSGI 服務,但我想至少讓它變得重要。

它是一個多租戶系統,因此每個用戶都會屬於某個租戶。 根據租戶上下文,您可以使用 RequestContext 對象,它實際上檢查該租戶的用戶是否使用 SecurityManager 具有適當的訪問權限並允許特定用戶。

好吧,我至少發現了一些東西: ResourceResolverFactory.getThreadResourceResolver返回請求對其自身進行身份驗證的最后一個 ResourceResolver。 因此,如果將 ResourceResolverFactory 注入服務,那么由此返回的 ResourceResolver 的 getUserId 似乎至少提供了一個用戶可以模擬的用戶 ID。

(請注意,這不一定是用戶本身的原始 id,因為如果代碼使用ResourceResolverFactory.getResourceResolver ,這會更改結果。但這至少意味着用戶可以模擬返回的用戶 id。)

另一件事是使用像 Composum 的PlatformAccessFilter這樣的 ServletFilter,它將原始 SlingHttpRequest 使用的 ResourceResolver 保留在 ThreadLocal 中。 (如果惡意代碼能夠部署具有更高優先級的 ServletFilter,該方案就會失效,但我們必須停在某處。)

不幸的是,這兩種想法都不適用於服務解析器,因為 ResourceResolverFactory.getServiceResolver 沒有設置 esourceResolverFactory.getThreadResourceResolver 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM