Rev 1690 | Rev 1696 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Classe de controle d'accès aux services** Cette classe propose des méthodes permettant :* - l'authentification http pour bloquer ou autoriser l'accès* - de déterminer les droits des utilisateurs** @category DEL* @package Commun* @author Aurélien Peronnet <aurelien@tela-botanica.org>* @author Jean-Pascal Milcent <jpm@tela-botanica.org>* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL* @copyright Copyright (c) 1999-2014, Tela Botanica (accueil@tela-botanica.org)*/class ControleAcces {private $conteneur;private $gestionBdd;private $bdd;public function __construct($conteneur) {$this->conteneur = $conteneur;$this->gestionBdd = $conteneur->getGestionBdd();$this->bdd = $this->gestionBdd->getBdd();}public function controlerIpAutorisees() {$ipsAutorisees = $this->conteneur->getParametreTabeau('ip_autorisees');$remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);$serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP);if (in_array($remoteIp, $ipsAutorisees) == false) {if ($remoteIp != $serverIp) {// ATTENTION : maintenir ce test à l'intérieur du précédent$message = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\n";$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;throw new Exception($message, $code);}}return true;}public function demanderAuthentificationAdmin() {if (!$this->etreAdminAutoriseParHttp()) {$this->authentifierAdmin();}}public function demanderAuthentificationUtilisateur() {if (!$this->etreUtilisateurAutoriseParHttp()) {$this->authentifierUtilisateur();}}private function etreUtilisateurAutoriseParHttp() {$identifiant = $this->getAuthIdentifiant();$mdp = $this->getAuthMotDePasse();$existe = $this->obtenirUtilisateur($identifiant, $mdp);$autorisation = (isset($existe) && $existe) ? true :false;return $autorisation;}private function obtenirUtilisateur($login, $motDePasse) {$login = $this->bdd->proteger($login);$motDePasse = $this->bdd->proteger($motDePasse);$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '.'FROM del_utilisateur AS du '."WHERE courriel = $login "." AND mot_de_passe = MD5($motDePasse) ".' -- '.__FILE__.':'.__LINE__."\n";$utilisateur = $this->bdd->recuperer($requete);return $utilisateur;}private function etreAdminAutoriseParHttp() {$identifiant = $this->getAuthIdentifiant();$autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;return $autorisation;}private function etreAdmin($courriel) {$courriel = $this->bdd->proteger($courriel);$requete = 'SELECT dui.admin '.'FROM del_utilisateur AS du LEFT JOIN del_user_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '."WHERE du.courriel = $courriel ".' -- '.__FILE__.':'.__LINE__."\n";$infoUtilisateur = $this->bdd->recuperer($requete);$etreAdmin = $this->verifierDroitAdmin($infoUtilisateur['admin']);return $etreAdmin;}private function verifierDroitAdmin($droit) {$droitAdmin = $this->conteneur->getParametre('droit_superadmin');$etreAdmin = false;if (isset($droit) && $droit == $droitAdmin) {$etreAdmin = true;}return $etreAdmin;}private function getAuthIdentifiant() {$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;return $id;}private function getAuthMotDePasse() {$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;return $mdp;}//TODO: externaliser noms et adresses spécifiques à Tela Botanicaprivate function authentifierAdmin() {$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";$message_echec = "Accès limité aux administrateurs de DEL.\n"."Votre tentative d'identification a échoué.\n"."Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur.";return $this->authentifier($message_accueil, $message_echec, 'Admin');}private function authentifierUtilisateur() {$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";$message_echec = "Accès limité aux utilisateurs de DEL.\n"."Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n"."Votre tentative d'identification a échoué.\n"."Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'.";return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');}private function authentifier($message_accueil, $message_echec, $type) {$id = $this->getAuthIdentifiant();if (!isset($id)) {$this->envoyerAuth($message_accueil, $message_echec);} else {if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') {$autorisation = true;} else {$methodeAutorisation = "etre{$type}Autorise";$autorisation = $this->$methodeAutorisation();}if ($autorisation == false) {$this->envoyerAuth($message_accueil, $message_echec);}}return true;}public function etreUtilisateurAvecDroitAdmin() {$infos = $this->getInfosUtilisateurConnecte();$etreAdmin = false;if (isset($infos['admin'])) {$etreAdmin = $this->verifierDroitAdmin($infos['admin']);}if ($etreAdmin == false) {$message = "Vous ne pouvez pas accéder à ce service car vous n'avez pas les droits d'administrateur !\n";$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;throw new Exception($message, $code);}return $etreAdmin;}public function getInfosUtilisateurConnecte() {$utilisateur = array();if (isset($_COOKIE['del_courriel'])) {$courriel = $_COOKIE['del_courriel'];$motDePasse = $_COOKIE['del_mot_de_passe'];$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($courriel, $motDePasse);}return $utilisateur;}private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) {$login = $this->bdd->proteger($login);$motDePasseEncrypte = $this->bdd->proteger($motDePasseEncrypte);$requete = 'SELECT du.*, admin, preferences, date_premiere_utilisation '.'FROM del_utilisateur AS du '.' LEFT JOIN del_utilisateur_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '."WHERE du.courriel = $login "." AND du.mot_de_passe = $motDePasseEncrypte ".' -- '.__FILE__.':'.__LINE__."\n";$utilisateur = $this->bdd->recuperer($requete);return $utilisateur;}public function getIdAnonymeTemporaire() {$this->demarrerSession();return session_id();}private function demarrerSession() {if (session_id() == '') {// TODO : modifier ce test lors du passage en php 5.4session_start();}}}