![](/img/trans.png)
[英]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.