Comment lister les droits d'accès aux pages sur Oracle Portal ?

Oracle Portal vous permet de créer de jolis portail à vocation collaborative, documentaire, etc …
Une fonctionnalité importante de ce produit est de pouvoir paramétrer aisément les droits d’accès aux groupes de pages et pages composant votre portail.
Cette fonctionnalité est accessible via les propriétés de la page.

Un portail… ca évolue !

Cependant tout au long de sa carrière, le portail évolue…

  • De nouvelles pages alimentent le portail.
  • Un turn over des utilisateurs, et groupes d’utilisateurs.
  • Relooking et révision de l’ergonomie.
  • Changement de politique d’attribution des droits.

Pour ce dernier point, c’est sans doute celui qui pose le plus de problèmes en terme de gain de temps.
En effet, des groupes d’utilisateurs ont parfois trop de privilèges ce qui occasionne parfois de mauvaises surprises lorsque ceux ci mettent en ligne des documents ou réorganisent les informations. Le but est de recenser « qui » à accès à « quoi » dans le portail.
Et le travail s’annonce fastidieux si on ne connait pas la requête qui permet de faire le travail, car oui, toutes ces informations sont stockées en base (et heureusement d’ailleurs ;-)).
Fastidieux ? Bien oui … si on ne connait pas la requête, imaginons qu’un portail moyen comporte 5 groupes de pages, chaque groupe de page comporte 7 pages et chaque page comporte 3 sous pages… voila … cela fait 145 pages. En supposant qu’à partir des pages ont met en place la notion d’héritage (ce qui évite de redéfinir les droits aux sous pages), on en arrive a 40 pages.
Pour chaque page, il faut accéder aux propriétés de la page et lister le contenu de l’onglet « accès », supposons que cette manipulation prenne 30 secondes, cela nous fait 20 minutes.
Et oui … fastidieux tout de même … alors que si on connait la requête, ceci peut être fait en moins de 5 minutes.

Fastidieux ! Oui ! Mais …

Un travail harrassant, oui, mais heureusement qu’il existe des méthodes que l’on peut trouver dans les packages du schéma PORTAL. PORTAL.WWSEC_API.GRANTEE_LIST permet de réaliser cette tâche !!

Comment utiliser cette méthode ?

Trois éléments sont nécessaires en entrée de cette méthode :

  • p_object_type_name (type varchar2)
  • p_name (type varchar2)
  • p_language (type varchar2)

Le premier paramètre à pour valeur ‘portal.wwsec_api.PAGE_OBJ’, c’est à dire que l’on considère que l’objet ‘page’.
Le second paramètre est définit comme suit :

  • on déclare un type PAGE_RECORD :

l_page PORTAL.WWPOB_API_PAGE.PAGE_RECORD;
qui prend pour valeur PORTAL.WWPOB_API_PAGE.GET (p_id , p_siteid , p_language );

p_id étant l’identifiant de la page où doivent être extraites les informations et p_siteid étant l’identifiant du groupe de page auquel appartient cette même page.

  • on ne prend que l’élément ‘SYSPRIV_NAME’ de l’objet l_page (l_page.SYSPRIV_NAME).

Le troisième paramètre est la langue utilisée, elle ne sera pas utile ici.
En sortie de cette méthode, nous avons un tableau de ‘grant’ (grantee_array) défini comme suit :
l_grantees portal.wwsec_api.grantee_array;
Le tableau de Grant en sortie est un tableau de record, dans lequel nous récupèrerons les éléments suivants :

  • GRANTEE_NAME
  • PRIVILEGE

Voici un exemple  de code, qui va extraire les droits pour la page dont l’identifiant est 30 et l’identifiant de groupe de page est 76 :

l_page := PORTAL.WWPOB_API_PAGE.GET (p_id =>30, p_siteid => 76, p_language => NULL);
l_grantees := PORTAL.WWSEC_API.GRANTEE_LIST( p_object_type_name => portal.wwsec_api.PAGE_OBJ, p_name => l_page.SYSPRIV_NAME);
if l_grantees.count > 0 then
   for i in l_grantees.first..l_grantees.last loop
      if l_grantees.exists(i) then
         htp.p('GRANTEE_NAME = '||l_grantees(i).GRANTEE_NAME);
         htp.br;
         htp.p('PRIVILEGE = '||l_grantees(i).PRIVILEGE);
         htp.br;
      end if;
   end loop;
else
htp.p('aucun droit');
end if;

A l’execution de celui ci nous obtenons l’affichage suivant :

GRANTEE_NAME = ADMIN.INTERNET
PRIVILEGE = VIEW
GRANTEE_NAME = ADMIN.INTRA-INTER
PRIVILEGE = VIEW
GRANTEE_NAME = ADMIN.INTRANET
PRIVILEGE = VIEW

Trois groupes d’utilisateurs ayant chacun les mêmes droits…ceci pour la page ayant pour identifiant ’30’ dans le groupe de page dont l’identifiant est  ’76’ !!!

Et si on va plus loin …

On peut très bien créer une requête parcourant l’ensemble des groupes de pages, et pour chaque groupe de page récupérer l’arborescence de page et appeler la méthode précédemment appelée…
ce qui nous donnerait le code suivant :

Create or Replace Procedure EASYTEAM.RIGHTS_FOR_PAGES
as
l_page PORTAL.WWPOB_API_PAGE.PAGE_RECORD;
-- commentaires
p_caid number;
l_grantees portal.wwsec_api.grantee_array;
marge number:=0;
CURSOR cur IS
	SELECT  id, LEVEL, display_name title, parent_id
	FROM (
		SELECT a.id,a.display_name,a.parent_id,sub_folder_sequence
		FROM portal.wwsbr_all_folders a
		WHERE (a.caid = p_caid)
		AND (a.LANGUAGE='f')
		AND (a.DISPLAY_IN_PARENT_FOLDER=1)
	)
	START WITH parent_id = 1
	CONNECT BY PRIOR id = parent_id
	ORDER SIBLINGS BY sub_folder_sequence ASC;
BEGIN
	for c in (select caid, id,display_name, name from portal.wwsbr_all_folders where id=1 and display_in_parent_folder=1 and language='f' order by sub_folder_sequence) loop
		htp.p('<ul> <li>Groupe de page :'||c.display_name||'</li>');
		htp.br;
		p_caid:=c.caid;
		htp.p('<ul>');
		FOR enr IN cur LOOP
			marge:=35*enr.level;
			htp.p('<li style="margin-left:'||marge||'px">Nom de page :'||enr.title||'</li>');
			l_page := PORTAL.WWPOB_API_PAGE.GET (p_id =>enr.id, p_siteid => p_caid, p_language => NULL);
			l_grantees := PORTAL.WWSEC_API.GRANTEE_LIST( p_object_type_name => portal.wwsec_api.PAGE_OBJ,
			p_name => l_page.SYSPRIV_NAME);
			htp.p('<ul>');
			if l_grantees.count > 0 then
				for i in l_grantees.first..l_grantees.last loop
					if l_grantees.exists(i) then
						htp.p('<li style="margin-left:'||marge||'px">'||l_grantees(i).GRANTEE_NAME||'= '||l_grantees(i).PRIVILEGE||'</li>')
					end if;
				end loop;
				else
				htp.p('<li style="margin-left:'||marge||'px">aucun droit</li>');
			end if;
			htp.p('</ul>');
		END LOOP;
		htp.p('</ul></ul>');
	end loop;
end;

Et si on exécute ce petit bout de code …

Nous obtenons la liste de tous les droits affectées aux pages et sous pages de tous les groupes de page portal…

Bien sur, libre à vous de disposer vos informations comme bon vous semble !! ;-))

2 réflexions sur “Comment lister les droits d'accès aux pages sur Oracle Portal ?”

  1. Merci pour ce code très pratique.
    Il ne liste que les pages avec un accès spécifique. Comment pourrions nous y ajouter celles dont l’accès est hérité de la page parente, afin de réellement voir toutes les pages auxquelles un utilisateur ou groupe a accès ?

  2. Merci pour cet article, je cherchais un moyen de lister les droits mais on aimerait bien voir l’image représentative du rendu qui n’est pas insérée !

Les commentaires sont fermés.