Gestion des permissions des tokens

Gestion des permissions associées aux tokens au lieu d'avoir besoin d'une connexion utilisateur
This commit is contained in:
xdrm-brackets 2016-04-13 00:29:18 +02:00
parent c7d9607603
commit 08a2ad3602
4 changed files with 59 additions and 27 deletions

View File

@ -32,7 +32,7 @@
"network_data": { "network_data": {
"description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.", "description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.",
"permissions": ["admin"], "permissions": [],
"parameters": {} "parameters": {}
}, },

View File

@ -33,11 +33,15 @@
// Si les parametres de connection, on essaie de connecter // Si les parametres de connection, on essaie de connecter
if( $login_vars ){ if( $login_vars ){
$login = new ModuleRequest('users/login', array('login' => $login, 'password' => $password)); $login = new ModuleRequest('users/login', array(
'login' => $_POST['login'],
'password' => $_POST['password']
));
$login_ans = $login->dispatch(); $login_ans = $login->dispatch();
// Si aucune erreur, on dit qu'on vient de se connecter // Si aucune erreur, on dit qu'on vient de se connecter
if( $login_ans->ModuleError == ManagerError::Success ) if( $login_ans->error == ManagerError::Success )
$_SESSION['login_status'] = 'logged'; $_SESSION['login_status'] = 'logged';
// Si on n'a pas les bonnes donnees // Si on n'a pas les bonnes donnees

View File

@ -29,11 +29,12 @@
* *
* @path<String> Chemin de delegation ("module/methode") * @path<String> Chemin de delegation ("module/methode")
* @param<Array> Tableau associatif contenant les parametres utiles au traitement * @param<Array> Tableau associatif contenant les parametres utiles au traitement
* @token<String> Token d'acces a l'api (OPTIONNEL)
* *
* @return status<Boolean> Retourne si oui ou non tout s'est bien passe * @return status<Boolean> Retourne si oui ou non tout s'est bien passe
* *
*/ */
public function __construct($path=null, $params=null){ public function __construct($path=null, $params=null, $token=null){
// Si pas parametre manquant, on quitte // Si pas parametre manquant, on quitte
if( $path == null ){ if( $path == null ){
$this->error = ManagerError::MissingPath; $this->error = ManagerError::MissingPath;
@ -73,7 +74,7 @@
/* [3] Verification des droits /* [3] Verification des droits
=========================================================*/ =========================================================*/
if( !$this->checkPermission() ){ // Si on a pas les droits if( !$this->checkPermission($token) ){ // Si on a pas les droits
$this->error = ManagerError::PermissionError; $this->error = ManagerError::PermissionError;
return false; return false;
} }
@ -183,15 +184,6 @@
return $tmp; return $tmp;
} }
/* (2) Si le token n'est pas dans la BDD */
$checkToken = new Repo('token/check', array($_SERVER['PHP_AUTH_DIGEST']) );
$valid_token = $checkToken->answer();
if( !$valid_token ){
$tmp = new ModuleRequest();
$tmp->error = ManagerError::TokenError;
return $tmp;
}
/* [1] On verifie que le @path est renseigne /* [1] On verifie que le @path est renseigne
=========================================================*/ =========================================================*/
@ -205,17 +197,17 @@
// On retire le @path de @params // On retire le @path de @params
unset($params['path']); unset($params['path']);
/* [3] On retourne une instance de <ModuleRequest> /* [3] On retourne une instance de <ModuleRequest>
=========================================================*/ =========================================================*/
return new ModuleRequest($post['path'], $params); // On cree notre requete avec le token
return new ModuleRequest($post['path'], $params, $_SERVER['PHP_AUTH_DIGEST']);
} }
/* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE /* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE
* *
* @path<String> String correspondant au chemin de delegation ("module/methode") * @path<String> String correspondant au chemin de delegation ("module/methode")
@ -268,27 +260,58 @@
/* RETOURNE SI ON A LA PERMISSION D'EXECUTER CETTE METHODE /* RETOURNE SI ON A LA PERMISSION D'EXECUTER CETTE METHODE
* *
* @token<String> Token d'acces a l'API (OPTIONNEL)
*
* @return permission<bool> Retourne si on a les droits ou pas pour executer cette methode * @return permission<bool> Retourne si on a les droits ou pas pour executer cette methode
* *
*/ */
private function checkPermission(){ private function checkPermission($token=null){
/* [1] On recupere les informations utiles
=========================================================*/
// On recupere le nom de la methode // On recupere le nom de la methode
$method = $this->modules[$this->path['module']][$this->path['method']]; $method = $this->modules[$this->path['module']][$this->path['method']];
// Si aucune permission n'est definie // Si aucune permission n'est definie
if( !isset($method['permissions']) ) return true; if( !isset($method['permissions']) ) return true;
// On recupere les permissions
/* [2] Gestion si un @token est defini
=========================================================*/
if( Database::check('sha1', $token) ){
/* (1) On verifie que le token est valide */
$checkToken = new Repo('token/check', array($token) );
$token_permissions = $checkToken->answer();
// Si le token est invalide, on retourne FAUX
if( $token_permissions === false ) return false;
$local_permissions = $token_permissions;
/* [3] Gestion si aucun token, avec utilisateu connecte
=========================================================*/
}else
$local_permissions = $_SESSION['permission'];
/* [4] Verification des droits parmi les permissions donnees
=========================================================*/
/* (1) On recupere la liste des permissions possibles */
$permissions = $method['permissions']; $permissions = $method['permissions'];
// Si aucune permission n'est definie, on laisse l'acces /* (2) Si aucune permission n'est definie, on laisse l'acces */
if( count($permissions) == 0 ) return true; if( count($permissions) == 0 ) return true;
// On verifie qu'il y a au moins une permission ok /* (3) On verifie qu'il y a au moins une permission ok */
foreach($permissions as $permission) foreach($permissions as $permission)
if( permission($permission) ) return true; if( in_array($permission, $local_permissions) ) return true;
// On retourne FAUX si aucun droit n'a ete trouve
/* [5] On retourne FAUX si aucun droit n'a ete trouve
=========================================================*/
return false; return false;
} }

View File

@ -75,7 +75,7 @@
* *
* @token<String> Token en question * @token<String> Token en question
* *
* @return valid<bool> Retourne si VRAI ou FAUX le token est valid * @return permissions<Array> Retourne les permissions (droits) du token s'il est valide sinon retourne FAUX
* *
*/ */
public static function check($token){ public static function check($token){
@ -92,16 +92,21 @@
/* [2] Verification dans la base de donnees /* [2] Verification dans la base de donnees
=========================================================*/ =========================================================*/
$check = Database::getPDO()->prepare("SELECT id_token $check = Database::getPDO()->prepare("SELECT id_token, permission
FROM api_token FROM api_token
WHERE CURDATE() <= expires WHERE CURDATE() <= expires
AND token = :token"); AND token = :token");
$check->execute(array( ':token' => $token )); $check->execute(array( ':token' => $token ));
$token_info = $check->fetch();
/* [3] On retourne le resultat // Si le token est inactif, on retourne FALSE
if( $token_info === false ) return false;
/* [3] On retourne le resultat (les permissions du token)
=========================================================*/ =========================================================*/
return $check->fetch() !== false; return explode( ',', str_replace(' ', '', $token_info['permission']) );
} }