2017-02-02 3 views
1

사용자 지정 역할에 대한 레이아웃에 대한보기 권한을 전파하려고했는데 해당 레이아웃과 해당 사용자 지정 역할에 대한 resourcepermission 테이블에 항목이 없습니다. 아래의 코드와 같이 레이아웃 권한이 이상적으로 오류 로그에 표시된대로 오류를 제공,Liferay의 사용자 지정 역할에 대한 레이아웃보기 권한을 추가하는 방법

ResourcePermissionServiceUtil.setIndividualResourcePermissions(groupId, companyId, layout.getModelClassName(), 
       "primkey", roleIdsToActionIds); 

그러나, 여기에 첫 번째 호출 작동하지만 두 번째 호출은 현재 레이아웃의 부모 레이아웃 권한을 설정하여 설정해야합니다. 누군가 이걸 어떻게 달성 할 수 있는지 안내해 줄 수 있습니까?

// Propagete VIEW access to Page, on which Portlet is added - START 
long plid = LayoutLocalServiceUtil.getDefaultPlid(groupId, false, portletId); 
if(plid!=0){ 
Layout layout = LayoutLocalServiceUtil.getLayout(plid); 
if(layout!=null){ 
    _log.info("Adding permission for layout: "+layout+", layout model class name:"+layout.getModelClassName()+", scope:"+ResourceConstants.SCOPE_INDIVIDUAL 
      +", primkey:"+String.valueOf(plid)+", roleid:"+customRoleId+", actionid:"+ ActionKeys.VIEW); 

    Map<Long, String[]> roleIdsToActionIds = new HashMap<Long, String[]>(); 
    List<String> actionIds = new ArrayList<String>(); 
    actionIds.add(ActionKeys.VIEW); 

    roleIdsToActionIds.put(customRoleId, actionIds.toArray(new String[actionIds.size()])); 

    ResourcePermissionServiceUtil.setIndividualResourcePermissions(groupId, companyId, layout.getModelClassName(), 
      String.valueOf(plid), roleIdsToActionIds); 


    // TODO: give view permission to all its parent layouts as well 
    while(layout.getParentLayoutId()!=0){ 
     layout = LayoutLocalServiceUtil.getParentLayout(layout); 
     _log.info("Adding permission for parent layout: "+layout+", layout model class name:"+layout.getModelClassName()+", scope:"+ResourceConstants.SCOPE_INDIVIDUAL 
       +", primkey:"+String.valueOf(layout.getPlid())+", roleid:"+customRoleId+", actionid:"+ ActionKeys.VIEW); 

     ResourcePermissionServiceUtil.setIndividualResourcePermissions(groupId, companyId, layout.getModelClassName(), 
       String.valueOf(layout.getPlid()), roleIdsToActionIds); 
    } 

    _log.debug("Added view permission for page of portlet:"+portletId); 

    } 
} // Propagete VIEW access to Page, on which Portlet is added - END 

오류 로그 :이 API 호출이 내 문제를 해결 것처럼

... 


Adding permission for layout: {uuid=e3d30768-8025-494b-b651-aa12e34baa45, plid=100207, groupId=AAA, companyId=XXX, userId=20199, userName=Liferay Admin, createDate=Sat Jan 14 00:56:55 GMT 2017, modifiedDate=Sat Jan 14 00:58:48 GMT 2017, privateLayout=false, layoutId=89, parentLayoutId=30, name=<?xml version='1.0' encoding='UTF-8'?><root available-locales="en_US" default-locale="en_US"><Name language-id="en_US">Notifications</Name></root>, title=, description=, keywords=, robots=, type=portlet, typeSettings=column-1=XXX_WAR_YYY, 
    column-2=XXXZZZ_WAR_XXXWWW 
    layout-template-id=my_custom_layout 
    , hidden=false, friendlyURL=/notifications, iconImage=false, iconImageId=0, themeId=, colorSchemeId=, wapThemeId=, wapColorSchemeId=, css=, priority=4, layoutPrototypeUuid=, layoutPrototypeLinkEnabled=false, sourcePrototypeLayoutUuid=}, layout model class name:com.liferay.portal.model.Layout, scope:4, primkey:100207, roleid:73933, actionid:VIEW 
    02:01:14,465 INFO [http-bio-443-exec-46][setupServiceImpl:955] layout.getParentLayoutId():30 
    02:01:14,466 INFO [http-bio-443-exec-46][setupServiceImpl:958] Adding permission for parent layout: {uuid=f7202f94-3660-426f-bd18-7e083668d5ac, plid=26752, groupId=AAA, companyId=XXX, userId=XXX, userName=XXX Admin, createDate=Thu Apr 14 15:59:06 GMT 2016, modifiedDate=Wed Dec 07 20:33:22 GMT 2016, privateLayout=false, layoutId=30, parentLayoutId=3, name=<?xml version='1.0' encoding='UTF-8'?><root available-locales="en_US" default-locale="en_US"><Name language-id="en_US">Users</Name></root>, title=, description=, keywords=, robots=, type=link_to_layout, typeSettings=column-1-customizable=false 
    column-2-customizable=false 
    groupId=AAA 
    layout-template-id=my_custom_layout 
    layoutUpdateable=true 
    linkToLayoutId=31 
    privateLayout=false 
    sitemap-changefreq=daily 
    sitemap-include=1 
    , hidden=false, friendlyURL=/users, iconImage=false, iconImageId=0, themeId=classic, colorSchemeId=, wapThemeId=, wapColorSchemeId=, css=, priority=9, layoutPrototypeUuid=, layoutPrototypeLinkEnabled=false, sourcePrototypeLayoutUuid=}, layout model class name:com.liferay.portal.model.Layout, scope:4, primkey:26752, roleid:73933, actionid:VIEW 
    java.lang.NullPointerException 
      at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.doUpdateResourcePermission(ResourcePermissionLocalServiceImpl.java:1200) 
      at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.doUpdateResourcePermission(ResourcePermissionLocalServiceImpl.java:1253) 
      at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.updateResourcePermission(ResourcePermissionLocalServiceImpl.java:1407) 
      at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.setResourcePermissions(ResourcePermissionLocalServiceImpl.java:1134) 
      at sun.reflect.GeneratedMethodAccessor1164.invoke(Unknown Source) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
      at java.lang.reflect.Method.invoke(Unknown Source) 
      at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:115) 
      at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:62) 
      at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:51) 
      at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111) 
      at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:175) 
      at com.sun.proxy.$Proxy152.setResourcePermissions(Unknown Source) 
      at com.liferay.portal.service.impl.ResourcePermissionServiceImpl.setIndividualResourcePermissions(ResourcePermissionServiceImpl.java:238) 
      at sun.reflect.GeneratedMethodAccessor1163.invoke(Unknown Source) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
      at java.lang.reflect.Method.invoke(Unknown Source) 
      at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:115) 
      at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:62) 
      at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:51) 
      at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111) 
      at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56) 
      at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111) 
      at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:175) 
      at com.sun.proxy.$Proxy153.setIndividualResourcePermissions(Unknown Source) 
      at com.liferay.portal.service.ResourcePermissionServiceUtil.setIndividualResourcePermissions(ResourcePermissionServiceUtil.java:245) 
+0

디버깅 결과는 무엇입니까? 레이아웃이 null이되는 레벨에서 권한 설정 전에 확인하도록 레이아웃 ID를 시도해 볼 수 있습니까? –

+0

@shivam, 코드에서 로거를 추가하고 그에 따라 오류 로그를 업데이트했습니다. – shuchi

+0

나의 이해에 따르면, 여기서 문제는 ResourcePermissionServiceUtil의 setIndividualResourcePermissions 메소드는 resourcepermission 테이블의 기존 항목 만 업데이트한다는 것입니다. 따라서 해당 역할의 레이아웃에 대한 권한 항목이 아직 존재하지 않으면이 예외와 함께 실패합니다. – shuchi

답변

1

그래서 마침내 보인다.

이 글을 시도하기 전에 다른 Liferay API도 두 가지 시도해 보았습니다.

ResourcePermissionServiceUtil.addResourcePermission(groupId, companyId, layout.getModelClassName(), ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(layout.getPlid()), customRoleId, ActionKeys.VIEW); 

ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, layout.getModelClassName(), ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(layout.getPlid()), roleIdsToActionIds); 

예외로 실패했습니다.

java.lang.NullPointerException 
    at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.doUpdateResourcePermission(ResourcePermissionLocalServiceImpl.java:1200) 
    at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.doUpdateResourcePermission(ResourcePermissionLocalServiceImpl.java:1253) 
    at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.updateResourcePermission(ResourcePermissionLocalServiceImpl.java:1407) 
    at com.liferay.portal.service.impl.ResourcePermissionLocalServiceImpl.setResourcePermissions(ResourcePermissionLocalServiceImpl.java:1134) 
+0

동일한 해결책을 찾았지만 VIEW 레이아웃에 대한 권한을 어떻게 비활성화 (삭제) 할 수 있을지 생각 중입니다. 실제로는 동작 키에 대한 Ressource 권한 만 추가 할 수 있습니다. – wikimix

관련 문제