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": {
"description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.",
"permissions": ["admin"],
"permissions": [],
"parameters": {}
},

View File

@ -33,11 +33,15 @@
// Si les parametres de connection, on essaie de connecter
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();
// 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';
// Si on n'a pas les bonnes donnees

View File

@ -29,11 +29,12 @@
*
* @path<String> Chemin de delegation ("module/methode")
* @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
*
*/
public function __construct($path=null, $params=null){
public function __construct($path=null, $params=null, $token=null){
// Si pas parametre manquant, on quitte
if( $path == null ){
$this->error = ManagerError::MissingPath;
@ -73,7 +74,7 @@
/* [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;
return false;
}
@ -183,15 +184,6 @@
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
=========================================================*/
@ -205,17 +197,17 @@
// On retire le @path de @params
unset($params['path']);
/* [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
*
* @path<String> String correspondant au chemin de delegation ("module/methode")
@ -268,27 +260,58 @@
/* 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
*
*/
private function checkPermission(){
private function checkPermission($token=null){
/* [1] On recupere les informations utiles
=========================================================*/
// On recupere le nom de la methode
$method = $this->modules[$this->path['module']][$this->path['method']];
// Si aucune permission n'est definie
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'];
// 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;
// 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)
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;
}

View File

@ -75,7 +75,7 @@
*
* @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){
@ -92,16 +92,21 @@
/* [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
WHERE CURDATE() <= expires
AND 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']) );
}