사용자 지정 역할에 대한 레이아웃에 대한보기 권한을 전파하려고했는데 해당 레이아웃과 해당 사용자 지정 역할에 대한 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)
디버깅 결과는 무엇입니까? 레이아웃이 null이되는 레벨에서 권한 설정 전에 확인하도록 레이아웃 ID를 시도해 볼 수 있습니까? –
@shivam, 코드에서 로거를 추가하고 그에 따라 오류 로그를 업데이트했습니다. – shuchi
나의 이해에 따르면, 여기서 문제는 ResourcePermissionServiceUtil의 setIndividualResourcePermissions 메소드는 resourcepermission 테이블의 기존 항목 만 업데이트한다는 것입니다. 따라서 해당 역할의 레이아웃에 대한 권한 항목이 아직 존재하지 않으면이 예외와 함께 실패합니다. – shuchi