2011-11-17 2 views

답변

6

ACL 접근은 (그러한 행동이 실제로 필요한 경우)으로가는 길입니다.

  • http://localhost:4502/content/geometrixx/en.html에 가서 저자로 author
  • 로그인에 deny jcr:read를 추가 /libs/foundation/components/page/dialog/items/tabs/items/image
  • 에 대한

    • 편집의 ACL :

      예를 들어, 기본 페이지 구성 요소의 "이미지"탭을 숨기려면 페이지 속성을 엽니 다.

    • 이미지 탭이 사라져야합니다.

    xtype=cqinclude에 포함 된 탭의 경우 포함 된 정의가 아니라 포함 자체에 설정해야한다는 점에 유의하십시오.런타임에는 include의 누락 된 대상에 대해 불만을 제기하고 대화 상자를 전혀 렌더링하지 않기 때문입니다.

  • 5

    이것은 사용자 정의 서블릿과 대화 이벤트 리스너를 통해 수행 할 수 있습니다.

    listener 함수는 현재 사용자 ID와 원하는 그룹을 전달하여 서블릿에 요청합니다. 대화 상자 탭은 서블릿 응답에 따라 숨길 수 있습니다. 여기

    가 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> 
    

    을 그리고 여기에 해당하는 서블릿입니다 ...

    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); 
         } 
        } 
    } 
    
    4

    한 질문 스프링 마음에 왜 하시겠습니까 제작 대화 상자의 제어를 제한하고 탭을 제거 하시겠습니까?

    ACL이 작동하지 않는 이유는 없습니다. 탭에 대해 충분히 제한적으로 설정 했습니까? 관리자가 아닌 사용자와 테스트를 했습니까? 나는 액세스 문제를 해결하기 위해 코드가 너무 무거운 것을 사용하는 것에 신중할 것입니다.

    개인적으로 ACL이 제대로 작동하지 않는다면 CQ5의 특정 버전으로 끝나는 코드 솔루션이 아닌 tabpanel xtype을 기반으로 새로운 위젯을 만들 수 있습니다.

    내 답변 : ACL을 사용하십시오.

    이 막연하게 관련 공식 문서를 살펴 제발 - 같은 원리하지만 서로 다른 목적 :

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

    anthonyh에서 언급 한 바와 같이

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

    관련 문제