New file |
0,0 → 1,203 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Classe de controle d'accès aux services de DEL. |
* |
* 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 Services |
* @package Bibliotheque |
* @version 0.1 |
* @author Mathias CHOUET <mathias@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Aurelien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org> |
*/ |
class ControleAcces { |
|
private $conteneur; |
private $bdd; |
|
public function __construct($conteneur) { |
$this->conteneur = $conteneur; |
$this->bdd = $this->conteneur->getBdd(); |
} |
|
public function controlerIpAutorisees() { |
$ipsAutorisees = $this->conteneur->getParametreTableau('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 Botanica |
private 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.4 |
session_start(); |
} |
} |
} |