Restreindre la création de site dans Share

Le comportement par défaut dans Alfresco Share est d'autoriser tous les utilisateurs à créer un site. Il est cependant possible de restreindre la création des sites aux administrateurs Alfresco et aux membres d'un groupe.

Pour commencer, il faut créer un groupe dans Alfresco destiné à gérer les utilisateurs autorisé à créer des sites. Ce groupe peut par exemple s'appeler "CREATEURS_SITE".

Ensuite, il faut copier les fichiers suivants :
Pour la version 4.1.x : TOMCAT_HOME/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/

  • components/dashlets/dynamic-welcome.get.js
  • components/dashlets/my-sites.get.html.ftl
  • components/dashlets/my-sites.get.js
  • modules/header/sites.get.html.ftl
  • modules/header/sites.get.js

Et les copier dans le répertoire TOMCAT_HOME/shared/classes/alfresco/web-extension/site-webscripts/org/alfresco.

A présent, il faut modifier ces fichiers afin de contrôler l'affichage du lien "Créer un site" :

Dans le fichier "my-sites.get.js" : ajouter la fonction "userHasGroup" et l'appel à cette fonction

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[i].itemName == "GROUP_"+group || groups[i].itemName == "GROUP_ALFRESCO_ADMINISTRATORS"){
        return true; // found group
      }else{
        mygroup = mygroups+groups[i].displayName;
      }
      }

      return false;
   }
   else return false;
}

function main()
{
   ... 
   //Restrict Site Creation to Administrators
   var createSiteVisible = userHasGroup(user.name, 'CREATEURS_SITE');
   model.createSiteVisible = createSiteVisible; 
}

main();

Ensuite, dans le fichier "my-sites.get.html.ftl" : ajout d'un "if" autour du lien "Créer un site" afin de gérer son affichage.

<#if createSiteVisible>
  <span class="align-right yui-button-align">
     <span class="first-child">
        <a href="#" id="${id}-createSite-button" class="theme-color-1">
           <img src="${url.context}/res/components/images/site-16.png" style="vertical-align: text-bottom" />
           ${msg("link.createSite")}</a>
     </span>
  </span>
</#if>

Il faut faire de même pour les fichiers "sites.get.html.ftl" et "sites.get.js".

Enfin, il faut modifier le fichier "dynamic-welcome.get.js" : La gestion de l'affichage du lien se fait dans la fonction "getSiteColumn()". Le lien est affiché lorsque son libellé n'est pas vide.

Ainsi, il faut ajouter la fonction "userHasGroup(username, group)" et modifier la fonction "getSiteColumn()" de la façon suivante :

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[i].itemName == "GROUP_"+group || groups[i].itemName == "GROUP_ALFRESCO_ADMINISTRATORS"){
        return true; // found group
      }else{
        mygroup = mygroups+groups[i].displayName;
      }
      }
     
      return false;
   }
   else return false;
}
function getSiteColumn()
{
  var createSiteVisible = userHasGroup(user.name, 'CREATEURS_SITE');
  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
   });
}

Pour que ces modifications soient prises en compte, il est nécessaire de recharger les services web Share via cette url : /share/service/index.

Les modifications apportées ci-dessus permettent de contrôler l'affichage du lien permettant de créer un site. Il est possible en ajustant les permissions définies sur les méthodes du service "SiteService" d'autoriser uniquement les membres de ce groupe et les administrateurs à créer des sites (la création d'un site pouvant en effet se faire via l'API Java et des appels à ce service).

Pour cela, il faut créer un fichier "custom-public-services-security-context.xml" à cet emplacement : TOMCAT_HOME/shared/classes/alfresco/extension. Recopier ensuite dans ce fichier le bean "SiteService_security" contenu dans le fichier TOMCAT_HOME/webapps/alfresco/WEB-INF/classes/alfresco/public-services-security-context.xml :

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> 
<beans> 
    <bean id="SiteService_security" class="org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityInterceptor">
        ...
        <property name="objectDefinitionSource">
            <value>
               ...
               org.alfresco.service.cmr.site.SiteService.createSite=ACL_METHOD.GROUP_CREATEURS_SITE
               org.alfresco.service.cmr.site.SiteService.deleteSite=ACL_METHOD.GROUP_CREATEURS_SITE
               ...
            </value>
        </property>
    </bean> 
</beans>

Pour que cette modification soit prise en compte, il est nécessaire de redémarrer Alfresco.

Catégorie: