Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Linh Lê Ngoc
Recherche d'articles filtrés par permissions accordées aux Teams
May 14, 2013 9:05 AM
Answer

Linh Lê Ngoc

Rank: New Member

Posts: 10

Join Date: October 8, 2010

Recent Posts

Bonjour,

Question :

Est-il possible d'ajouter les roles liés aux Teams dans le champ 'roleId' de l'index lucène ? (sans Hook)
ou
Y a-t-il un moyen relativement simple de rechercher des Journal Articles en filtrant sur Scope, StructureId, Tag, Titre, Date de modification et permissions attribuées à des Teams ?

Contexte :
Liferay 6.1 ee ga2

Je travaille sur un site dans une architecture multi-sites (dans le sens Liferay), ce qui me contraint énormément sur l'utilisation de Hooks ou du Service Builder.
Je crée mes articles avec des droits VIEW accordés à des Teams de mon site.

J'ai besoin de lister des JournalArticle en fonction de plusieurs filtres (Scope, structureId, tag, titre, ... et permissions !) et en gardant les fonctions de pagination.
Je me suis donc orienté vers une recherche via Facet.

J'ai réussi (tant bien que mal) à créer ma requête :
1+(+(companyId:1) +(assetTagNames:france) +((+(+(entryClassName:com.liferay.portlet.journal.model.JournalArticle) +(userId:12149 (roleId:17 roleId:18 roleId:16 roleId:20013 roleId:10154 roleId:21306 groupRoleId:19-10154 groupRoleId:19-20013))) +(classNameId:0) +(status:0) +(structureId:COUNTRY_NEWS))) +(+(groupId:19) +(scopeGroupId:19)))

mais celle-ci ne me retourne pas les articles visibles par les Teams.
Lors que je parcours l'index Lucène, le champs roleId ne contient que l'id du role Owner (10149 dans mon cas).

A priori lors de l'indexation, les roles de type PROVIDER ne sont pas pris en compte.
En suivant les appels, on trouve dans
com.liferay.portal.search.SearchPermissionCheckerImpl.doAddPermissionFields_6(long companyId, long groupId, String className, String classPK,Document doc)

1List<Role> roles = ResourceActionsUtil.getRoles(companyId, group, className, null);

Cette fonction retourne les rôles en fonction d'un tableau de type passé en paramètre ou, si il est null (notre cas), appelle getRoleType(..) qui ne prend pas TYPE_PROVIDER.


merci,

Linh
Linh Lê Ngoc
RE: Recherche d'articles filtrés par permissions accordées aux Teams
May 15, 2013 7:11 AM
Answer

Linh Lê Ngoc

Rank: New Member

Posts: 10

Join Date: October 8, 2010

Recent Posts

à priori, je ne suis pas le seul à avoir eu le pb :
http://www.liferay.com/community/forums/-/message_boards/view_message/14125227#_19_message_14208737

Voici une solution utilisant une redéfinition de la fonction getRoleType(..) (plugin Ext, dans ext-impl).

ExtResourceActionsImpl :
 1package com....security.permission;
 2
 3import com.liferay.portal.model.Group;
 4import com.liferay.portal.model.Organization;
 5import com.liferay.portal.model.RoleConstants;
 6import com.liferay.portal.model.User;
 7import com.liferay.portal.service.GroupServiceUtil;
 8
 9public class ExtResourceActionsImpl extends com.liferay.portal.security.permission.ResourceActionsImpl  {
10
11    protected int[] getRoleTypes(
12        long companyId, Group group, String modelResource) {
13
14        int[] types = {
15            RoleConstants.TYPE_REGULAR, RoleConstants.TYPE_SITE, RoleConstants.TYPE_PROVIDER
16        };
17
18        if (isPortalModelResource(modelResource)) {
19            if (modelResource.equals(Organization.class.getName()) ||
20                modelResource.equals(User.class.getName())) {
21
22                types = new int[] {
23                    RoleConstants.TYPE_REGULAR, RoleConstants.TYPE_ORGANIZATION
24                };
25            }
26            else {
27                types = new int[] {RoleConstants.TYPE_REGULAR};
28            }
29        }
30        else {
31            if (group != null) {
32                if (group.isLayout()) {
33                    try {
34                        group = GroupServiceUtil.getGroup(
35                            group.getParentGroupId());
36                    }
37                    catch (Exception e) {
38                    }
39                }
40
41                if (group.isOrganization()) {
42                    types = new int[] {
43                        RoleConstants.TYPE_REGULAR,
44                        RoleConstants.TYPE_ORGANIZATION, RoleConstants.TYPE_SITE
45                    };
46                }
47                else if (group.isUser()) {
48                    types = new int[] {RoleConstants.TYPE_REGULAR};
49                }
50            }
51        }
52
53        return types;
54    }
55
56}


ext-spring.xml :
 1<?xml version="1.0"?>
 2
 3<beans
 4    default-destroy-method="destroy"
 5    default-init-method="afterPropertiesSet"
 6    xmlns="http://www.springframework.org/schema/beans"
 7    xmlns:aop="http://www.springframework.org/schema/aop"
 8    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 9    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
10>
11    <bean id="com.liferay.portal.security.permission.ResourceActions" class="com...security.permission.ExtResourceActionsImpl ">
12        <property name="portal" ref="com.liferay.portal.util.Portal" />
13    </bean>
14</beans>


Si cette solution (bien que ne répondant pas à mes contraintes) peut en aider certains...

Linh