Adobe CQ5-根据用户组在组件对话框中隐藏选项卡?

Adobe CQ5-根据用户组在组件对话框中隐藏选项卡?,adobe,crx,aem,Adobe,Crx,Aem,你知道如何根据用户所属的用户组隐藏或显示对话框选项卡面板吗 我试图通过CRX内容探索者(ACL)实现这一点。但我的运气不太好 Cheers这可以通过自定义servlet和对话事件侦听器来实现 侦听器函数向servlet发出请求,传递当前用户ID和所需的组。然后可以根据servlet响应隐藏对话框选项卡 以下是CQ5组件的dialog.xml示例: ... ... 下面是相应的servlet: import java.io.IOException; 导入org.apache.felix.scr

你知道如何根据用户所属的用户组隐藏或显示对话框选项卡面板吗

我试图通过CRX内容探索者(ACL)实现这一点。但我的运气不太好


Cheers

这可以通过自定义servlet和对话事件侦听器来实现

侦听器函数向servlet发出请求,传递当前用户ID和所需的组。然后可以根据servlet响应隐藏对话框选项卡

以下是CQ5组件的dialog.xml示例:


...
...
下面是相应的servlet:

import java.io.IOException;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Properties;
导入org.apache.felix.scr.annotations.Property;
导入org.apache.felix.scr.annotations.Service;
导入org.apache.sling.api.SlingHttpServletRequest;
导入org.apache.sling.api.SlingHttpServletResponse;
导入org.apache.sling.api.servlets.SlingAllMethodsServlet;
导入org.codehaus.jackson.json工厂;
导入org.codehaus.jackson.jsongGenerationException;
导入org.codehaus.jackson.jsonggenerator;
导入org.codehaus.jackson.JsonGenerator.Feature;
导入org.codehaus.jackson.map.JsonMappingException;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.day.cq.security.Group;
导入com.day.cq.security.User;
导入com.day.cq.security.UserManager;
导入com.google.common.collect.ImmutableMap;
@组件(立即=真)
@服务
@性质({
@属性(name=“service.description”,value=“组成员servlet检查用户是否为组成员。”),
@属性(name=“sling.servlet.path”,value=“/bin/member”)
})
公共类GroupMemberServlet扩展SlingAllMethodsServlet{
/**必需的*/
私有静态最终长serialVersionUID=1L;
/**记录器*/
私有静态最终记录器LOG=LoggerFactory.getLogger(GroupMemberServlet.class);
私有静态最终JsonFactory=新JsonFactory().disable(Feature.AUTO\u CLOSE\u目标);
私有静态最终ObjectMapper MAPPER=新ObjectMapper();
@凌驾
受保护的无效数据集(最终SlingHttpServletRequest请求,最终SlingHttpServletResponse响应){
final UserManager UserManager=request.getResourceResolver().adapto(UserManager.class);
最终字符串userId=request.getRequestParameter(“userId”).getString();
最终字符串groupId=request.getRequestParameter(“groupId”).getString();
最终的组=(组)userManager.get(groupId);
最终用户=(用户)userManager.get(用户ID);
writeJsonResponse(response,ImmutableMap.of(“isMember”,group.isMember(user));
}
私有void writeJsonResponse(最终SlingHttpServletResponse响应,最终对象){
setContentType(“应用程序/json”);
响应。setCharacterEncoding(“utf-8”);
试一试{
final JsonGenerator generator=FACTORY.createJsonGenerator(response.getWriter());
MAPPER.writeValue(生成器、对象);
}捕获(最终JsonGenerationException jge){
LOG.error(“生成JSON响应的错误”,jge);
}捕获(最终JsonMappingException jme){
error(“错误映射JSON响应”,jme);
}捕获(最终ioe异常ioe){
error(“写入JSON响应时出错”,ioe);
}
}
}

我突然想到一个问题……为什么要限制对创作对话框的控制并删除选项卡

ACL没有理由不适用于此。您是否将它们设置为对选项卡有足够的限制?您是否正在使用非管理员用户进行测试?我会谨慎地使用代码如此繁重的东西来解决访问问题

就我个人而言,如果ACL不能像预期的那样工作,我会探索基于tabpanel xtype创建一个新的小部件,而不是一个代码解决方案,它可能最终特定于一个CQ5版本

我的答案是:使用ACL

请看一看这些模糊相关的官方文件——相同的原则,但不同的目标:

正如anthonyh所指出的,ACL方法是一条可行之路(如果确实需要这样的行为)

例如,要隐藏基本页组件的“图像”选项卡,请执行以下操作:

  • 编辑
    /libs/foundation/components/page/dialog/items/tabs/items/image的ACL
  • 添加
    deny jcr:read
    for
    author
  • 以作者身份登录
  • 转到并打开页面属性
  • “图像”选项卡应该消失
请注意,如果选项卡包含在
xtype=cqinclude
中,则必须在包含本身而不是包含的定义上进行设置。因为在运行时,它会抱怨include缺少目标,而根本不会呈现对话框