Permettre la création de site à un groupe spécifique

cancel
Showing results for 
Search instead for 
Did you mean: 
iowimi
Member II

Permettre la création de site à un groupe spécifique

Bonjour à tous,

Je suis débutant sur Alfresco et j'ai une question à laquelle je ne trouve pas de réponse malgré mes recherches :

Comment puis-je donner le droit de création de site à un groupe autre que les administrateurs ?

J'ai trouvé la doc wiki disant qu'il fallait modifier le fichier  " webapps/alfresco/WEB-INF/classes/alfresco/public-services-security-context.xml"
à la ligne 993  en remplaçant :

[org.alfresco.service.cmr.site.SiteService.createSite=<b>ACL_ALLOW</b>]

par

[org.alfresco.service.cmr.site.SiteService.createSite=<b>ACL_METHOD.ROLE_ADMINISTRATOR</b>]

Mais le problème ici est que cela donne le droit aux admins seuls.
Je souhaiterai le donner à un groupe en particulier, du style "CREATEUR_SITE".

Pourriez-vous me donner un début de piste ?

Merci d'avance!
2 Replies
iowimi
Member II

Re: Permettre la création de site à un groupe spécifique

Vu que personne n'a été en mesure de m'aider, j'ai dû me débrouiller seul.

Par défaut, Alfresco permet à tous ses utilisateurs de créer des sites. Etant donné que la création de site doit être contrôlée, il est nécessaire d'appliquer des restrictions sur cette fonctionnalité.
Seul un groupe d'utilisateurs identifiés nommé « SITE_CREATOR » sera autorisé à créer des sites (dans mon exemple).

Pour restreindre cette fonctionnalité, nous devons intervenir sur plusieurs fichiers situés à différents niveaux :

    public-services-security-context.xml : Les modifications apportées à ce fichier permettent, coté serveur, de n'autoriser que le groupe « SITE_CREATOR » à créer ou supprimer des sites.
        Ce fichier se situe dans le répertoire : …/tomcat/alfresco/webapps/alfresco/WEB-INF/classes/alfresco

Le contenu du fichier :

Tout d'abord, lors de la création du groupe, veillez à lui donner l'identifiant "SITE_CREATOR", le nom que vous donnerez au groupe n'a pas d'importance.
C'est cet identifiant qui sera utilisé dans le mécanisme d'Alfresco.

Reprenez l'intégralité du fichier original en ne modifiant que les lignes suivantes.
Les modifications apportées se situent aux lignes 993 et 994 du fichier.

Lignes originales :

org.alfresco.service.cmr.site.SiteService.createSite=ACL_ALLOW
org.alfresco.service.cmr.site.SiteService.deleteSite=ACL_ALLOW


Lignes après modification :

org.alfresco.service.cmr.site.SiteService.createSite=ACL_METHOD.GROUP_SITE_CREATOR
org.alfresco.service.cmr.site.SiteService.deleteSite=ACL_METHOD.GROUP_SITE_CREATOR


Pour que le groupe ALFRESCO_ADMIN puisse également avoir ce droit, il suffit de le mettre en sous-groupe de SITE_CREATOR. De ce fait, les admins hériteront des droits.

    share-header.get.js : Ce fichier ne contient qu'un peu de code qui surchargera le fichier original. Le code qu'il contient permet de masquer le lien « Création de site » sur l'interface /Share.
        Ce fichier se situe dans le répertoire : …/tomcat/alfresco/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/share/header


Dans ce fichier nous ne reprendrons pas le code existant. Nous ne ferons qu'écrire notre propre code qui surchargera ensuite celui d'Alfresco.
Le contenu du fichier :


// Fonction permettant de savoir si l'utilisateur passé en paramètre appartient aux groupes "ALFRESCO_ADMIN" ou au groupe dont l'ID est passé en paramètres.

function userHasGroup(username, group) {
   var result = remote.call("/api/people/" + stringUtils.urlEncode(username) + "?groups=true");
   if (result.status == 200 && result != "{}")
   {
      var user = eval('(' + result + ')');

      var groups = new Array();
      groups = user.groups;
      var mygroups = "";
      for (i=0; i<groups.length; i++)
      {
             if (groups.itemName == "GROUP_"+group || groups.itemName == "GROUP_ALFRESCO_ADMINISTRATORS"){
            return true; // Groupe trouvé
          }else{
            mygroup = mygroups+groups.displayName;
          }
      }

      return false;
   }
   else return false;
}


// Trouver le menu "Sites" …
var sitesMenu = widgetUtils.findObject(model.jsonModel, "id", "HEADER_SITES_MENU");
if (sitesMenu != null)
{

    //Appel de la fonction userHasGroup et passage du nom de l'utilisateur et de l'ID du groupe en paramètres.
   var createSiteVisible = userHasGroup(user.name, 'SITE_CREATOR');

    if (createSiteVisible)
    {
  //Si l'utilisateur a les droits, afficher le menu de creation de site
  sitesMenu.config.showCreateSite = true;

  }else{
  //Si l'utilisateur n'a pas les droits, cacher le menu de creation de site
   sitesMenu.config.showCreateSite = false;
  }

}


    dynamic-welcome.get.js : Ce fichier ne contient qu'un peu de code qui surchargera le fichier original. Le code qu'il contient permet de masquer l'icône de création de site sur le dashlet « Mes sites ».
        Ce fichier se situe dans le répertoire : …/tomcat/alfresco/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/dashlets

Dans ce fichier nous reprenons l'intégralité du code original en le modifiant.
Nous devons insérer notre fonction userHasGroup() dans le main().

// Fonction permettant de savoir si l'utilisateur appartient aux groupes "ALFRESCO_ADMIN" ou "SITE_CREATOR"
function userHasGroup(username, group) {
   var result = remote.call("/api/people/" + stringUtils.urlEncode(username) + "?groups=true");
   if (result.status == 200 && result != "{}")
   {
      var user = eval('(' + result + ')');

      var groups = new Array();
      groups = user.groups;
      var mygroups = "";
      for (i=0; i<groups.length; i++)
      {
         if (groups.itemName == "GROUP_"+group || groups.itemName == "GROUP_ALFRESCO_ADMINISTRATORS"){
        return true; // found group
          }else{
        mygroup = mygroups+groups.displayName;
          }
      }

      return false;
   }
   else return false;
}


Puis modifier la fonction getSiteColumn() inclue dans le main() en appelant notre fonction userHasGroup().


function getSiteColumn()
   {
                  var createSiteVisible = userHasGroup(user.name, 'SITE_CREATOR');
                  var actionMsgLib = "";
                  if(createSiteVisible)
                  {
                    actionMsgLib = "welcome.user.sites.link";
                  }

               return (
               {
                  title: "welcome.user.sites.title",
                  description: "welcome.user.sites.description",
                  imageUrl: "/res/components/images/help-site-bw-64.png",
                  actionMsg: actionMsgLib,
                  actionHref: "#",
                  actionId: "-createSite-button",
                  actionTarget: null
               });
   }




Etant donné que tous ces fichiers ont le même but, il s'avère judicieux de les regrouper pour les déployer par la suite en tant que module que l'on nommera « Restriction-creation-site ».
Il est donc nécessaire de savoir comment créer un module.

[H1]Alfresco : Les modules[/H1]
[H2]Quelle utilité ?[/H2]


Les modules permettent de packager un ensemble de fichiers qui ont pour objectifs de surcharger les fichiers originaux d'Alfresco. Ce module est chargé au démarrage mais n'est pas automatiquement actif. Pour l'activer, il faudra utiliser l'outil « Module Deployment » que nous verrons à la fin.

[H2]Comment les créer ?[/H2]

Prérequis :

    JDK installé

[H2]Créer l'arborescence du module et organiser les fichiers.[/H2]


    Ce qui est obligatoire :
        Vous devez créer un dossier « alfresco », il sera notre répertoire de travail.
        Il contiendra 2 sous-dossiers :
            site-data : contiendra à son tour le dossier « extensions » qui déclarera les paramètres de votre module.
            site-webscripts : contiendra vos fichiers modifiés qui surchargeront les fichiers existants.


Nous allons commencer par détailler ce que va contenir site-webscripts.
Etant donné que nous avons 3 fichiers à packager ayant des rôles bien définis, nous allons procéder comme suit :

    public-services-security-context.xml sera placé dans le dossier :
        site-webscripts/securite-serveur/creation-site

   share-header.get.js sera placé dans le dossier :
        site-webscripts/menu-site/creation-site

    dynamic-welcome.get.js sera placé dans le dossier :
        site-webscripts/menu-dashlets/creation-site


Cela devrait donc ressembler à l'image en pièce jointe.

Ensuite, il faut déclarer ce module afin de dire à Alfresco ce qu'il doit faire de ces fichiers. Pour cela, il faut se rendre dans le dossier extensions et y créer un fichier « extension.xml ». Nous nommerons ce fichier « creation-site-extension.xml » et y inscrirons le code suivant :


<extension>
  <modules>
    <module>
      <id>Resctriction creation de site</id>
      <version>2.0</version>
      <customizations>
        <customization>
          <targetPackageRoot>org.alfresco</targetPackageRoot>
          <sourcePackageRoot>securite-serveur.creation-site</sourcePackageRoot>
        </customization>
        <customization>
          <targetPackageRoot>org.alfresco.share.header</targetPackageRoot>
          <sourcePackageRoot>menu-site.creation-site</sourcePackageRoot>
        </customization>
        <customization>
          <targetPackageRoot>org.alfresco.components.dashlets</targetPackageRoot>
          <sourcePackageRoot>menu-dashlets.creation-site</sourcePackageRoot>
        </customization>
      </customizations>
    </module>
  </modules>
</extension>


    La balise "id" permet de nommer ce module.
    La balise "version" permet d'attribuer un numéro de version à ce module
    La balise "customizations" (avec un « s ») pourra avoir plusieurs enfants <customization> (sans « s »).
    La balise "customization" (sans « s ») définira une règle de customisation.
    La balise "targetPackageRoot" précisera quel est le répertoire cible qui sera surchargé dans les fichiers du serveur Alfresco.
    La balise "sourcePackageRoot" précisera quel répertoire de votre module surchargera la cible.

Nous avons 3 fichiers avec des répertoires différents, donc 3 customisations à définir.

Attention : Dans les balises "targetPackageRoot" et "sourcePackageRoot", le chemin des répertoires ne comporte aucun « / ».

Ceux-ci sont remplacés par des points « . ».

Il faut veiller à ce que les chemins soient corrects pour que cela fonctionne.

Maintenant que le module est correctement organisé et déclaré, il faut le packager en « .Jar ».
Pour créer un JAR, vous pouvez vous référer à cet excellent tutoriel, c'est relativement facile :
http://www.wikihow.com/Create-JAR-File

[H2]Dans quel répertoire les placer ?[/H2]


Une fois le Jar créé, il suffit de le copier dans le répertoire : /data/tomcat/alfresco/shared/lib
Afin qu'il soit pris en compte dans la liste des modules disponibles, il faudra redémarrer le serveur. Le module ne sera pas activé et déployé par défaut.


[H2]Comment les déployer ?[/H2]

Afin de les déployer il faudra tout d'abord se connecter de façon normale à /Share :
http://(votre alfresco):8080/share

Puis une fois sur votre tableau de bord, il faudra modifier l'URL de la façon suivante :
http://(votre alfresco):8080/share/page/modules/deploy

Il suffira alors de le sélectionner dans la liste de gauche, de l'ajouter à la liste de droite et enfin d'appliquer ce changement.

Le module sera alors déployé et vos fichiers surchargeront automatiquement ceux d'Alfresco à chaque démarrage.


Ce qu'il faut savoir, c'est que la modification de l'interface /Share a changée depuis la version 4.2.d. Donc pour masquer le lien "Créer un site" dans le header, il faut obligatoirement passer par un module. Placer vos fichiers modifiés directement dans "web-extensions" ne fonctionnera tout simplement pas.

Les infos qui m'ont été le plus utiles sont disponibles à l'adresse suivante : http://blogs.alfresco.com/wp/developer/2013/09/04/customizing-the-share-header-menu-part-1/ (Essentiellement les parties 1 et 3).



jeanjot
Active Member

Re: Permettre la création de site à un groupe spécifique

Encore merci pour avoir pris le temps de détailler la solution de gestion des droits de création des sites selon un groupe d'utilisateur spécifique.

cordialement

JeanJot