Fórum

Inicialización manual de permisos para un DLFileEntry

Piña Kanpokaldean, modificado 8 Anos atrás.

Inicialización manual de permisos para un DLFileEntry

Junior Member Postagens: 79 Data de Entrada: 14/04/12 Postagens Recentes
Buenas,

He preguntado ésto en el foro en inglés pero no he recibido contestación alguna, así que he decidido probar suerte en el de castellano también.

Básicamente, estoy trabajando en un portlet que incluye una subida de imágenes, que posteriormente añado programáticamente a la biblioteca de documentos de liferay. Funciona casi perfectamente, el único problema es que los permisos no parecen estar inicializados y como consecuencia ningún usuario que no sea un administrador puede ver las imágenes subidas. Curiosamente, en el momento que voy a contenido y miro los permisos de la imágen que acabo de subir, no sólo veo que los usuarios no registrados tienen permiso de ver la imágen sino que a partir de ése momento la imagen es visible para todos.

Asumo que hay algún tipo de inicialización que estoy pasando por alto, pero no encuentro ningún código relacionado en la JSP de los permisos. He probado a añadir el permiso para ver archivos manualmente al elemento DLFileEntry inmediatamente tras crearlo, pero éso tampoco ha solucionado el problema. He encontrado éste otro hilo que quizás estaba relacionado y tampoco me ha ayudado. Ésto me pasaba con liferay 6.2 GA2, he actualizado a GA4 y sigue igual.

Tiene alguien algún consejo sobre cómo proseguir para solucionar éste problema? Yo ya estoy en blanco, no sé qué más probar. Agradecería mucho cualquier ayuda que podáis prestarme.

El código que uso para crear el elemento es el siguiente, espero que ayude a clarificar el problema:

log.info("Generating new DL file for stored file "+file.getFileId());
DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.addFileEntry(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), themeDisplay.getScopeGroupId(), instance.getProjectImageFolder(), file.getName(), MimeTypesUtil.getContentType(actualFile), file.getName(), type.getDescription(), "SSS", 0, fieldsMap, actualFile, null, actualFile.length(), new ServiceContext());
file.setFileEntryId(fileEntry.getFileEntryId());
updateStoredFile(file);
	
Role guest = RoleLocalServiceUtil.getRole(themeDisplay.getCompanyId(), RoleConstants.GUEST);
String[] actionsRO = new String[] { ActionKeys.VIEW }; 
ResourcePermissionLocalServiceUtil.setResourcePermissions(themeDisplay.getCompanyId(), DLFileEntry.class.getName(), ResourceConstants.SCOPE_COMPANY, String.valueOf(fileEntry.getFileEntryId()), guest.getRoleId(), actionsRO);


Edit: He esquivado el problema dando al rol invitado permiso para ver todos los documentos en el panel de control. Los permisos de los documentos individuales siguen sin inicializarse, pero al menos el sistema funciona de cara al usuario. Sigo interesado en saber cuál era el problema, pero no puedo dedicarle más tiempo.
thumbnail
Beatriz Valdés Suárez, modificado 8 Anos atrás.

RE: Inicialización manual de permisos para un DLFileEntry

Junior Member Postagens: 50 Data de Entrada: 31/03/14 Postagens Recentes
Hola...

En mi caso tengo un script para asignar permisos a carpetas por equipos, que hasta el momento no me ha dado problemas.
Te copio el código por si te fuera de utilidad llevándolo a los ficheros.

Role role = RoleLocalServiceUtil.getRole(companyId, String.valueOf(equipo.getTeamId()));
					long roleId = role.getRoleId();
					out.println("Encontre team : " + equipo.getName() + " role: " + role.getName());

					ResourcePermission resourcePermission = null;
					try {
							resourcePermission = ResourcePermissionLocalServiceUtil
									.getResourcePermission(companyId, DLFolder.class.getName(),
											ResourceConstants.SCOPE_INDIVIDUAL,
											String.valueOf(dlFolder.getPrimaryKey()), roleId);

							out.println("Carpeta con permiso asignado " + dlFolder.getName());
						} catch (com.liferay.portal.NoSuchResourcePermissionException e) {

							resourcePermission = ResourcePermissionLocalServiceUtil
									.createResourcePermission(
											CounterLocalServiceUtil.increment("com.liferay.portal.model.ResourcePermission"));
							resourcePermission.setCompanyId(companyId);
							resourcePermission.setName(DLFolder.class.getName());
							resourcePermission.setScope(ResourceConstants.SCOPE_INDIVIDUAL);
							resourcePermission.setPrimKey(String.valueOf(dlFolder
									.getPrimaryKey()));
							resourcePermission.setRoleId(roleId);

							ResourcePermissionLocalServiceUtil
									.addResourcePermission(resourcePermission);

							out.println("Carpeta sin permiso asignado " + dlFolder.getName());
						}
			
					// Permisos lectura
					ResourceAction resourceAction_VIEW = ResourceActionLocalServiceUtil
							.getResourceAction(DLFolder.class.getName(), ActionKeys.VIEW);
					//out.println("hasAction VIEW: " + ResourcePermissionLocalServiceUtil.hasActionId(resourcePermission, resourceAction_VIEW));
					
					if (Validator.isNotNull(resourcePermission)
						&& !ResourcePermissionLocalServiceUtil.hasActionId(
							resourcePermission, resourceAction_VIEW)) {
						resourcePermission.setActionIds(resourcePermission.getActionIds() + resourceAction_VIEW.getBitwiseValue());
						out.println("permiso activado");
					}

					ResourcePermissionLocalServiceUtil.updateResourcePermission(resourcePermission);
thumbnail
Beatriz Valdés Suárez, modificado 8 Anos atrás.

RE: Inicialización manual de permisos para un DLFileEntry

Junior Member Postagens: 50 Data de Entrada: 31/03/14 Postagens Recentes
Hola, has conseguido solucionarlo?
Piña Kanpokaldean, modificado 8 Anos atrás.

RE: Inicialización manual de permisos para un DLFileEntry

Junior Member Postagens: 79 Data de Entrada: 14/04/12 Postagens Recentes
Perdón por el retraso en la respuesta, he tenido un lío (o dos) y no he mirado el foro hasta hoy.

Pues sí y no. En principio, la asignación de permisos funciona, se lo asigno y luego lo compruebo y todos felices y contentos. Pero seguía faltando algún tipo de inicialización. Al final, lo que he hecho ha sido cambiar los permisos de todos los usuarios (rol guest) y asignarles permiso para ver todos los documentos. De ésa forma evito el problema de que imágenes individuales no se puedan ver, y como mi aplicación no require seguridad en las imágenes pues da el pego.
thumbnail
Julio Varela Gómez, modificado 8 Anos atrás.

RE: Inicialización manual de permisos para un DLFileEntry

Regular Member Postagens: 130 Data de Entrada: 14/01/08 Postagens Recentes
Prueba este método a mi me funciona.

Añade este metodo a tu portlet enviale un fileEntry en este caso inicializa para Rol user y permiso ver... podrías ponerle cualquier otro rol u otro permiso.
Espero te sirva de guia.
Alguna duda pregunta

public static void setFilePermissions(FileEntry fileEntry) throws Exception{
ResourcePermission resourcePermission = null;
final Role siteMemberRole = RoleLocalServiceUtil.getRole(fileEntry.getCompanyId(), RoleConstants.USER);
ResourceAction resourceAction = ResourceActionLocalServiceUtil.getResourceAction(DLFileEntry.class.getName(), ActionKeys.VIEW);
try
{
resourcePermission = ResourcePermissionLocalServiceUtil.getResourcePermission(fileEntry.getCompanyId(),
DLFileEntry.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(fileEntry
.getPrimaryKey()), siteMemberRole.getRoleId());


if (Validator.isNotNull(resourcePermission))
{

resourcePermission.setActionIds(resourceAction.getBitwiseValue());
ResourcePermissionLocalServiceUtil.updateResourcePermission(resourcePermission);
}
} catch (com.liferay.portal.NoSuchResourcePermissionException e)
{

resourcePermission = ResourcePermissionLocalServiceUtil
.createResourcePermission(CounterLocalServiceUtil.increment());
resourcePermission.setCompanyId(fileEntry.getCompanyId());
resourcePermission.setName(DLFileEntry.class.getName());
resourcePermission.setScope(ResourceConstants.SCOPE_INDIVIDUAL);
resourcePermission.setPrimKey(String.valueOf(fileEntry.getPrimaryKey()));
resourcePermission.setRoleId(siteMemberRole.getRoleId());
resourcePermission.setActionIds(resourceAction.getBitwiseValue());// (ActionKeys.VIEW);
ResourcePermissionLocalServiceUtil.addResourcePermission(resourcePermission);
}
}