我正在尝试使用sling的userManager REST接口构建我的应用程序的管理UI,但我想自定义json渲染。例如,我希望"Get group"的响应仅在请求者是成员时才包含成员。
我从添加libs / sling / group / json.esp开始,但我不明白如何获取默认响应并自定义它。即使我不得不从头开始查询和构建json,我在哪里可以找到有关可用于从JCR / Sling获取此数据的API的信息?
我发现我可以使用ResourceTraversor以json形式转储资源对象,但使用新的Packages.org.apache.sling.servlets.get.impl.helpers.ResourceTraversor(-1,10000,resource,true) esp抛出错误
答案 0 :(得分: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不同的方式处理用户组的呈现,则需要创建一个正在侦听类型为sling/group
的资源的请求的servlet。为此目的创建一个servlet并将其注册到OSGI可能是理想的。 http://sling.apache.org/site/servlets.html提供了设置所需的各种属性,以确保servlet解析器找到您的servlet。然后,您的servlet将处理请求,因此可以直接轻松地访问所请求的资源。
第三,您指定的特殊需求是您不希望呈现组成员,除非请求用户是所请求组的成员。这是一个访问控制问题,而不是渲染问题。开箱即用的Sling和Jackrabbit尽可能少地假设您可能希望如何设置应用程序。在这种情况下,您需要建立适用于您的特定用例的访问控制。 Jackrabbit wiki(http://wiki.apache.org/jackrabbit/AccessControl)中访问控制的wiki帖子在一定程度上进入了这个范围。
答案 1 :(得分: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状态代码。