Le remplacement de l'authentification Intranet par le CAS implique de gérer deux chose :
* la configuration de la protection CAS sur une application
* la gestion des droits d'accès en fonction de l'appartenance à des catégories de personnel
Ces deux points étaient gérée entièrement par authentification Intranet alors que le CAS ne gère que la première. Il est donc indispensable de gérer par du code le filtrage des gens que se connectent.
Pour ce faire une solution est de mettre en place un système de comparaison entre une liste locale à chaque application et de la comparer avec la liste des groupe d'appartenance renvoyée par le CAS.
Le fichier contenant la liste locale doit reprendre la même structuration des données définissant un groupe.
ulb:all:personnel:patgs
Le personnel administratif de l'université libre de bruxelles
Le array fourni par le CAS et contenant la liste des groups d'appartenance de la personne qui se connecte n'est pas proprement défini et mélange du texte de mise en forme avec les données relatives aux groupes à proprement parler. C'est la structure hiérarchisée des catégories de type **ulb:sous-catégorie1:sous-catégorie2** qu'il faut récupérer.
**La fonction groupeAccess** reprend les groupes fournis par le CAS sous forme d'un array et élague le texte de mise en forme pour ne laisser que la structure hiérachisée des catégories qui est ensuite insérée dans un array de retour nettoyé.
function groupeAccess($arrayGroupe)
{
$arrayGroupePropre = array();
foreach ($arrayGroupe as $LigneGroupe)
{
$Groupe=substr($LigneGroupe, (strpos($LigneGroupe,"[id=")+4));
$Groupe=rtrim($Groupe,"]");
array_push($arrayGroupePropre,$Groupe);
}
return $arrayGroupePropre;
}
On compare ensuite cet array nettoyé avec le array construit sur le fichier local de droits d'accès.
function hasAccess($arrayGroupe)
{
$arrayGroupePropre = groupeAccess($arrayGroupe);
$file="./access.xml";
$xml = new DOMDocument();
if(!$xml->load($file))
{
echo "
Erreur avec dom. Pas bien !";
}
$groupeAccess=$xml->getElementsByTagName('groupeAccess');
$trouve=false;
foreach ($groupeAccess as $groupeHasAccess)
{
$groupe=$groupeHasAccess->getElementsByTagName('groupe');
if(in_array($groupe->item(0)->nodeValue,$arrayGroupePropre))
{
$trouve=true;
}
}
return $trouve;
}