1,11 → 1,12 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Classe de controle d'accès aux services de DEL. |
* Classe de controle d'accès HTTP AUTH aux services de DEL, à n'utiliser |
* que dans ce cas (HTTP AUTH), et pas dans le cas de l'identification générale sur le SSO |
* |
* Cette classe propose des méthodes permettant : |
* - l'authentification http pour bloquer ou autoriser l'accès |
* - de déterminer les droits des utilisateurs |
* - l'authentification HTTP pour bloquer ou autoriser l'accès |
* - de déterminer le statut d'admin des utilisateurs |
* |
* @category DEL |
* @package Services |
20,8 → 21,8 |
*/ |
class ControleAcces { |
|
private $conteneur; |
private $bdd; |
protected $conteneur; |
protected $bdd; |
|
public function __construct($conteneur) { |
$this->conteneur = $conteneur; |
28,6 → 29,11 |
$this->bdd = $this->conteneur->getBdd(); |
} |
|
/** |
* Vérifie que l'IP du client est dans la liste "ip_autorisees" de la config |
* @throws Exception |
* @return boolean |
*/ |
public function controlerIpAutorisees() { |
$ipsAutorisees = $this->conteneur->getParametreTableau('ip_autorisees'); |
|
44,6 → 50,9 |
return true; |
} |
|
/** |
* Exige qu'un administrateur s'autenthentifie à l'aide de HTTP AUTH |
*/ |
public function demanderAuthentificationAdmin() { |
if (!$this->etreAdminAutoriseParHttp()) { |
$this->authentifierAdmin(); |
50,6 → 59,9 |
} |
} |
|
/** |
* Exige qu'un utilisateur s'autenthentifie à l'aide de HTTP AUTH |
*/ |
public function demanderAuthentificationUtilisateur() { |
if (!$this->etreUtilisateurAutoriseParHttp()) { |
$this->authentifierUtilisateur(); |
56,66 → 68,61 |
} |
} |
|
private function etreUtilisateurAutoriseParHttp() { |
/** |
* Lit les entêtes HTTP AUTH et vérifie si l'utilisateur |
* existe (courriel / mot de passe); si $doitEtreAdmin est true, |
* vérifiera également que l'utilisateur est administrateur de Del |
* |
* @return boolean true si l'utilisateur est identifié, false sinon |
*/ |
protected function etreUtilisateurAutoriseParHttp($doitEtreAdmin=false) { |
$identifiant = $this->getAuthIdentifiant(); |
$mdp = $this->getAuthMotDePasse(); |
$existe = $this->obtenirUtilisateur($identifiant, $mdp); |
|
$autorisation = (isset($existe) && $existe) ? true :false; |
return $autorisation; |
} |
$autorisation = (isset($existe) && $existe) ? true :false; // c'est quoi ces tests de clodos ?? |
|
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; |
if ($doitEtreAdmin === true) { |
$autorisation = ($autorisation && $this->etreAdmin($identifiant)); |
} |
|
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; |
/** |
* Lit les entêtes HTTP AUTH et vérifie que l'utilisateur est identifié |
* et est administrateur de Del |
* |
* @return boolean true si l'utilisateur est identifié et admin de Del, false sinon |
*/ |
protected function etreAdminAutoriseParHttp() { |
return $this->etreUtilisateurAutoriseParHttp(true); |
} |
|
private function verifierDroitAdmin($droit) { |
$droitAdmin = $this->conteneur->getParametre('droit_superadmin'); |
$etreAdmin = false; |
if (isset($droit) && $droit == $droitAdmin) { |
$etreAdmin = true; |
} |
return $etreAdmin; |
} |
|
private function getAuthIdentifiant() { |
/** |
* Lit l'identifiant utilisateur dans les entêtes HTTP AUTH |
* @return String l'identifiant utilisateur ou null |
*/ |
protected function getAuthIdentifiant() { |
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null; |
return $id; |
} |
|
private function getAuthMotDePasse() { |
/** |
* Lit le mot de passe dans les entêtes HTTP AUTH |
* @return String le mot de passe ou null |
*/ |
protected 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() { |
/** |
* Envoie un message HTTP 401 / une boîte de login HTTP AUTH avec des |
* messages correspondant à la demande d'authentification d'un administrateur |
* TODO: externaliser noms et adresses spécifiques à Tela Botanica |
* @return boolean |
*/ |
protected 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". |
123,7 → 130,13 |
return $this->authentifier($message_accueil, $message_echec, 'Admin'); |
} |
|
private function authentifierUtilisateur() { |
/** |
* Envoie un message HTTP 401 / une boîte de login HTTP AUTH avec des |
* messages correspondant à la demande d'authentification d'un utilisateur |
* TODO: externaliser noms et adresses spécifiques à Tela Botanica |
* @return boolean |
*/ |
protected 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". |
132,7 → 145,11 |
return $this->authentifier($message_accueil, $message_echec, 'Utilisateur'); |
} |
|
private function authentifier($message_accueil, $message_echec, $type) { |
/** |
* Envoie l'authentification HTTP AUTH , et accepte un mode "debug" pour |
* les petits malins |
*/ |
protected function authentifier($message_accueil, $message_echec, $type) { |
$id = $this->getAuthIdentifiant(); |
if (!isset($id)) { |
$this->envoyerAuth($message_accueil, $message_echec); |
150,54 → 167,68 |
return true; |
} |
|
public function etreUtilisateurAvecDroitAdmin() { |
$infos = $this->getInfosUtilisateurConnecte(); |
|
$etreAdmin = false; |
if (isset($infos['admin'])) { |
$etreAdmin = $this->verifierDroitAdmin($infos['admin']); |
/** |
* Envoie un message HTTP 401 / une boîte de login HTTP AUTH |
* @param string $message_accueil |
* @param string $message_echec |
*/ |
private function envoyerAuth($message_accueil, $message_echec) { |
header('HTTP/1.0 401 Unauthorized'); |
header('WWW-Authenticate: realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"'); |
header('Content-type: text/plain; charset=UTF-8'); |
print $message_echec; |
exit(0); |
} |
|
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) { |
/** |
* Authentifie et récupère un utilisateur directement depuis la table des |
* utilisateurs Del, utile pour l'authentification HTTP AUTH - ne pas |
* utiliser pour les services Del qui doivent être branchés au SSO |
*/ |
protected function obtenirUtilisateur($login, $motDePasse) { |
$login = $this->bdd->proteger($login); |
$motDePasseEncrypte = $this->bdd->proteger($motDePasseEncrypte); |
$requete = 'SELECT du.*, admin, preferences, date_premiere_utilisation '. |
$motDePasse = $this->bdd->proteger($motDePasse); |
$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '. |
'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 ". |
"WHERE courriel = $login ". |
" AND mot_de_passe = MD5($motDePasse) ". |
' -- '.__FILE__.':'.__LINE__."\n"; |
$utilisateur = $this->bdd->recuperer($requete); |
return $utilisateur; |
} |
|
public function getIdAnonymeTemporaire() { |
$this->demarrerSession(); |
return session_id(); |
/** |
* Vérifie dans la table des utilisateurs Del qu'un utilisateur |
* (identifié par son courriel) est administrateur de Del |
* |
* @param string $courriel |
* @return boolean true si l'utilisateur est administrateur de Del, false sinon |
*/ |
protected 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 demarrerSession() { |
if (session_id() == '') { |
// TODO : modifier ce test lors du passage en php 5.4 |
session_start(); |
/** |
* Vérifie que la valeur "admin" d'un profil utilisateur correspond à la valeur |
* attendue dans la config |
* |
* @return true si sébon, false si sépabon |
*/ |
protected function verifierDroitAdmin($droit) { |
$droitAdmin = $this->conteneur->getParametre('droit_superadmin'); |
$etreAdmin = false; |
if (isset($droit) && $droit == $droitAdmin) { |
$etreAdmin = true; |
} |
return $etreAdmin; |
} |
|
} |