1

我正在尝试使用 sling 的 userManager REST 接口构建我的应用程序的管理 UI,但我想自定义 json 渲染。例如,我希望“获取组”的响应仅在请求者是成员时才包含成员。

我从添加 libs/sling/group/json.esp 开始,但我不明白如何获取默认响应并对其进行自定义。即使我必须从头开始查询和形成 json,我在哪里可以找到有关可用于从 JCR/Sling 获取此数据的 API 的信息?

我发现我可以使用 ResourceTraversor 以 json 形式转储资源对象,但是在 esp 中使用 new Packages.org.apache.sling.servlets.get.impl.helpers.ResourceTraversor(-1, 10000, resource, true) 会抛出一个错误

4

2 回答 2

2

这里有几点需要注意。

首先,您应该避免将代码放在libs目录下。您的应用程序代码应位于该apps目录下。当尝试为 URI 解析 servlet 时,Sling 将在检查apps之前进行检查libs,因此如果您需要完全覆盖 Sling 提供的功能,您可以将代码放在apps.

其次,当您请求时发生的事情(可能取决于您的设置方式)http://localhost:8080/system/userManager/group/administrators.tidy.1.json是由 Sling 的默认 GET servlet 处理的请求,因为它找不到其他适用的脚本或 servlet。出于研究目的,可能值得查看默认 get servlet 的代码org.apache.sling.servlets.get.impl.DefaultGetServlet,以了解它用于呈现 JSON 的内容。如果您需要以与默认 GET servlet 不同的方式处理用户组的呈现,那么您需要创建一个 servlet 来侦听对 type 资源的请求sling/group。为此目的创建一个 servlet 并将其注册到 OSGI 可能是理想的。 http://sling.apache.org/site/servlets.html提供您需要设置的各种属性,以确保 servlet 解析器找到您的 servlet。然后您的 servlet 将处理该请求,因此可以直接轻松地访问所请求的资源。

第三,您指定的特定需求是您不希望组成员呈现,除非请求用户是所请求组的成员。这更像是一个访问控制问题而不是渲染问题。Sling 和 Jackrabbit 开箱即用,对您可能希望如何设置应用程序做出尽可能少的假设。在这种情况下,您需要建立适用于您的特定用例的访问控制。Jackrabbit wiki ( http://wiki.apache.org/jackrabbit/AccessControl ) 中关于访问控制的 wiki 帖子在一定程度上涉及到这一点。

于 2012-06-09T14:36:37.373 回答
0

使用 Paul Michelotti 的回答中的指示,我进一步研究并找到了适合我的问题的解决方案。

Sling 通过如下所示的 SCR 注释接受请求过滤器 (javax.servlet.Filter)

@SlingFilter(scope = SlingFilterScope.REQUEST, order = Integer.MIN_VALUE)

每个请求在被 servlet 处理之前都被传递给过滤器。使用 resourceType,我能够区分对 group.1.json 和 group/mygroup.1.json 的请求。由于过滤器还可以访问当前用户,因此如果它不遵守我的安全模型并返回 404 状态代码,我可以决定拒绝该请求。

有关过滤器的详细信息,请参阅此页面。您还可以查看示例项目urlfilter以了解使用说明。

于 2012-07-11T13:53:13.603 回答