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

时间:2011-11-17 10:43:58

标签: adobe crx cq5

根据用户所属的用户组,我会隐藏或显示对话框选项卡面板的任何想法?

我试图通过CRX内容浏览器(ACL)来做到这一点。但是我没有太多运气。

干杯

3 个答案:

答案 0 :(得分:6)

anthonyh 所述, ACL方法是可行的方法(如果真的需要这样的行为)。

例如,要隐藏基页组件的“图像”选项卡:

请注意,如果xtype=cqinclude中包含选项卡,则必须在包含本身上设置它,而不是包含的定义。因为在运行时它会抱怨包含的遗失目标,而不是渲染对话框。

答案 1 :(得分:5)

这可以通过自定义servlet和对话框事件监听器来完成。

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

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

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root 
    xmlns:cq="http://www.day.com/jcr/cq/1.0" 
    xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="cq:Dialog" 
    xtype="dialog">
    <listeners jcr:primaryType="nt:unstructured"
        loadcontent="function(dialog) {
            var url = '/bin/member.json';

            // check if current user belongs to administrators group
            url = CQ.HTTP.addParameter(url, 'userId', CQ.User.getUserID());
            url = CQ.HTTP.addParameter(url, 'groupId', 'administrators');

            var result = CQ.HTTP.eval(url);

            if (!result.isMember) {
                // hide "tab2" if user is not an administrator
                dialog.findByType('tabpanel')[0].hideTabStripItem(1);
            }
        }" />
    <items jcr:primaryType="cq:WidgetCollection">
        <tab1 jcr:primaryType="cq:Widget" title="Text" xtype="panel">
            <items jcr:primaryType="cq:WidgetCollection">
                ...
            </items>
        </tab1>
        <tab2 jcr:primaryType="cq:Widget" title="Image" xtype="panel">
            <items jcr:primaryType="cq:WidgetCollection">
                ...
            </items>
        </tab2>
    </items>
</jcr:root>

这是相应的servlet:

import java.io.IOException;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonGenerator.Feature;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.security.Group;
import com.day.cq.security.User;
import com.day.cq.security.UserManager;
import com.google.common.collect.ImmutableMap;

@Component(immediate = true)
@Service
@Properties({
    @Property(name = "service.description", value = "Group Member servlet checks if a user is a member of a group."),
    @Property(name = "sling.servlet.paths", value = "/bin/member")
})
public class GroupMemberServlet extends SlingAllMethodsServlet {

    /** Required. */
    private static final long serialVersionUID = 1L;

    /** Logger */
    private static final Logger LOG = LoggerFactory.getLogger(GroupMemberServlet.class);

    private static final JsonFactory FACTORY = new JsonFactory().disable(Feature.AUTO_CLOSE_TARGET);

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) {
        final UserManager userManager = request.getResourceResolver().adaptTo(UserManager.class);

        final String userId = request.getRequestParameter("userId").getString();
        final String groupId = request.getRequestParameter("groupId").getString();

        final Group group = (Group) userManager.get(groupId);

        final User user = (User) userManager.get(userId);

        writeJsonResponse(response, ImmutableMap.of("isMember", group.isMember(user)));
    }

    private void writeJsonResponse(final SlingHttpServletResponse response, final Object object) {
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

        try {
            final JsonGenerator generator = FACTORY.createJsonGenerator(response.getWriter());

            MAPPER.writeValue(generator, object);
        } catch (final JsonGenerationException jge) {
            LOG.error("error generating JSON response", jge);
        } catch (final JsonMappingException jme) {
            LOG.error("error mapping JSON response", jme);
        } catch (final IOException ioe) {
            LOG.error("error writing JSON response", ioe);
        }
    }
}

答案 2 :(得分:4)

我想到一个问题......为什么要限制创作对话框的控制并删除标签?

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

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

我的答案:使用ACL。

请查看这些含糊不清的官方文件 - 同样的原则,但不同的目标:

http://dev.day.com/content/kb/home/cq5/CQ5SystemAdministration/CQ53HowToHideCQNavigationButtons.html

http://dev.day.com/docs/en/cq/current/administering/security.html