[英]How to call service Bundle in your application with OSGi apache felix
[英]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 資源的內部內容,但您不希望該用戶有權訪問這些內容。 在這里,您可能有某種防篡改方法來識別用戶,以便檢查他對服務的權限。
有些事情顯然是行不通的。
你還有其他可能實際可行的想法嗎? 非常感謝!
注意:我知道這里還有其他攻擊你必須阻止(例如使用反射侵入 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.