1,15 → 1,18 |
<?php |
/** |
* Classe de controle d'accès utilisant l'authentification http pour bloquer ou autoriser l'accès. |
* Elle offre des méthodes permettant de réserver l'accès à une section aux admins ou bien aux utilisateurs identifiés |
* Classe de controle d'accès aux services |
* |
* @category php 5.2 |
* @package 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 Commun |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@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 |
* @version $Id$ |
* @copyright Copyright (c) 1999-2014, Tela Botanica (accueil@tela-botanica.org) |
*/ |
class ControleAcces { |
|
23,19 → 26,31 |
$this->bdd = $this->gestionBdd->getBdd(); |
} |
|
public function controlerIpAutorisees() { |
$ipAutorisees = $this->conteneur->getParametre('ip_autorisees'); |
$ipAutorisees = explode(',', $ipAutorisees); |
|
if (!in_array($_SERVER['REMOTE_ADDR'], $ipAutorisees) && $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) { |
$message = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '{$_SERVER['REMOTE_ADDR']}' !\n"; |
$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE; |
throw new Exception($message, $code); |
} |
return true; |
} |
|
public function demanderAuthentificationAdmin() { |
if(!$this->etreAdminAutorise()) { |
if (!$this->etreAdminAutoriseParHttp()) { |
$this->authentifierAdmin(); |
} |
} |
|
public function demanderAuthentificationUtilisateur() { |
if(!$this->etreUtilisateurAutorise()) { |
if (!$this->etreUtilisateurAutoriseParHttp()) { |
$this->authentifierUtilisateur(); |
} |
} |
|
public function etreUtilisateurAutorise() { |
private function etreUtilisateurAutoriseParHttp() { |
$identifiant = $this->getAuthIdentifiant(); |
$mdp = $this->getAuthMotDePasse(); |
$existe = $this->obtenirUtilisateur($identifiant, $mdp); |
45,34 → 60,44 |
} |
|
private function obtenirUtilisateur($login, $motDePasse) { |
$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe FROM '.$this->gestionBdd->formaterTable('del_utilisateur', 'du'). |
'WHERE courriel = '.$this->gestionBdd->getBdd()->proteger($login).' '. |
'AND mot_de_passe = MD5('.$this->gestionBdd->getBdd()->proteger($motDePasse).')'; |
$utilisateur = $this->gestionBdd->getBdd()->recuperer($requete . ' -- ' . __FILE__ . ':' . __LINE__); |
$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 obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) { |
$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe FROM '.$this->gestionBdd->formaterTable('del_utilisateur', 'du'). |
'WHERE courriel = '.$this->gestionBdd->getBdd()->proteger($login).' '. |
'AND mot_de_passe = '.$this->gestionBdd->getBdd()->proteger($motDePasseEncrypte).' '; |
$utilisateur = $this->gestionBdd->getBdd()->recuperer($requete . ' -- ' . __FILE__ . ':' . __LINE__); |
return $utilisateur; |
} |
|
public function etreAdminAutorise() { |
private function etreAdminAutoriseParHttp() { |
$identifiant = $this->getAuthIdentifiant(); |
$autorisation = ($this->etreAdminDel($identifiant) && $this->etreUtilisateurAutorise()) ? true : false; |
$autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false; |
return $autorisation; |
} |
|
public function etreAdminDel($courriel) { |
$admins = Config::get('admins'); |
$courriels_autorises = explode(',', $admins); |
$autorisation = (in_array($courriel, $courriels_autorises)) ? 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; |
119,13 → 144,46 |
return true; |
} |
|
public function etreUtilisateurAvecDroitAdmin() { |
$infos = $this->getInfosUtilisateurConnecte(); |
|
$etreAdmin = false; |
if (isset($infos['admin'])) { |
$etreAdmin = $this->verifierDroitAdmin($infos['admin']); |
} |
return $etreAdmin; |
} |
|
public function getInfosUtilisateurConnecte() { |
if(isset($_COOKIE["del_courriel"])) { |
$utilisateur = array('del_courriel' => $_COOKIE["del_courriel"], |
'del_mot_de_passe' => $_COOKIE["del_mot_de_passe"]); |
$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($utilisateur['del_courriel'], $utilisateur['del_mot_de_passe']); |
$utilisateur = array(); |
if (isset($_COOKIE['del_courriel'])) { |
$courriel = $_COOKIE['del_courriel']; |
$motDePasse = $_COOKIE['del_mot_de_passe']; |
$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($courriel, $motDePasse); |
|
if ($utilisateur == false) { |
$message = "Vos login et/ou mot de passe ne sont pas corrects !\n"; |
$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE; |
throw new Exception($message, $code); |
} |
} else { |
$message = "Vous n'êtes pas identifié à DEL et/ou le cookie de DEL n'est pas accessible !\n"; |
$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE; |
throw new Exception($message, $code); |
} |
return $utilisateur; |
} |
|
private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) { |
$login = $this->bdd->proteger($login); |
$motDePasseEncrypte = $this->bdd->proteger($motDePasseEncrypte); |
$requete = 'SELECT du.*, dui.* '. |
'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; |
} |
|
136,7 → 194,7 |
|
private function demarrerSession() { |
if(session_id() == '') { |
// modifier ce test lors du passage en php 5.4 |
// TODO : modifier ce test lors du passage en php 5.4 |
session_start(); |
} |
} |