繁体   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