From 4a412db81a888f07311d34ff3b128fda45c8b8cd Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 4 Jul 2016 17:23:19 +0200 Subject: [PATCH] =?UTF-8?q?Gestion=20automatique=20pour=20l'API=20des=20au?= =?UTF-8?q?thentifications=20('warehouse'=20uniquement,=20'admin'=20=C3=A0?= =?UTF-8?q?=20faire)=20+=20permissions=20classiques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/modules.json | 2 +- manager/Authentification.php | 75 +++++++++++++++++++++++++++++++--- manager/ModuleRequest.php | 64 ++++++----------------------- manager/autoloader.php | 11 +---- manager/module/userDefault.php | 4 +- test/authTest.php | 3 +- 6 files changed, 88 insertions(+), 71 deletions(-) diff --git a/config/modules.json b/config/modules.json index 2fb0fe3..e70a6f3 100755 --- a/config/modules.json +++ b/config/modules.json @@ -144,7 +144,7 @@ "getById": { "description": "Retourne un utilisateur spécifique.", - "permissions": [], + "permissions": ["warehouse"], "parameters": { "id_user": { "description": "UID de l'utilisateur.", "type": "id" } }, diff --git a/manager/Authentification.php b/manager/Authentification.php index dd2db6d..c1f7765 100644 --- a/manager/Authentification.php +++ b/manager/Authentification.php @@ -22,7 +22,7 @@ * * */ - public static function init(){ + public static function check(){ /* (1) Initialisation ---------------------------------------------------------*/ if( !isset($_SESSION['AUTH']) ) $_SESSION['AUTH'] = []; @@ -56,7 +56,7 @@ /* (4) On vérifie l'authentification par BDD ---------------------------------------------------------*/ - if( !self::check() ) + if( !self::deepCheck() ) $_SESSION['AUTH'] = []; } @@ -67,15 +67,15 @@ * * */ - public static function check(){ + public static function deepCheck(){ /* [1] Si aucune authentification =========================================================*/ - if( authLevel() == 0 ) + if( self::auth() == 0 ) return false; /* [2] Si authentification unique =========================================================*/ - if( authLevel() >= 1 ){ + if( self::auth() >= 1 ){ $checkRoot = new Repo('warehouse/getByToken', [ $_SESSION['AUTH'][0] ]); // Si le token n'existe pas @@ -85,7 +85,7 @@ /* [3] Si authentification double =========================================================*/ - if( authLevel() >= 2 ){ + if( self::auth() >= 2 ){ $checkBranch = new Repo('admin/getByToken', [ $_SESSION['AUTH'][1] ]); // Si le token n'existe pas @@ -99,6 +99,69 @@ } + + + /* VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES + * + * @expected Liste des permissions attendues + * + * @return status Si FALSE, pas la permission, sinon si + * + */ + public static function permission($expected){ + /* [0] Mise à jour de l'authentification + =========================================================*/ + self::check(); + + + /* [1] Gestion de l'AUTH (authentification) + =========================================================*/ + + /* (1) Si entrepot requis, mais manquant + ---------------------------------------------------------*/ + if( in_array('warehouse', $expected) && self::auth() < 1 ) + return false; + + /* (2) Si admin requis, mais manquant + ---------------------------------------------------------*/ + if( in_array('admin', $expected) && self::auth() < 2 ) + return false; + + /* (3) On retire 'warehouse' et 'admin' de @expected + ---------------------------------------------------------*/ + $warehouseIndex = array_search('warehouse', $expected); + $adminIndex = array_search('admin', $expected); + if( is_int($warehouseIndex) ) unset($expected[$warehouseIndex]); + if( is_int($adminIndex) ) unset($expected[$adminIndex]); + + + /* [2] Gestion des permissions + =========================================================*/ + foreach($expected as $permission) + // Si il manque au minimum une permission, on retourne FALSE + if( !in_array($permission, $_SESSION['PERM']) ) + return false; + + var_dump('warehouse: ok'); + + /* [3] Si on a toutes les permissions requises + =========================================================*/ + return true; + } + + + + + + /* RENVOIE LE NIVEAU D'AUTHENTIFICATION + * + * @return auth Niveau d'authentification (0 à 2) + * + */ + public static function auth(){ + return !is_array($_SESSION['AUTH']) ? 0 : count($_SESSION['AUTH']); + } + } ?> diff --git a/manager/ModuleRequest.php b/manager/ModuleRequest.php index 6896cf6..94a2ba2 100755 --- a/manager/ModuleRequest.php +++ b/manager/ModuleRequest.php @@ -2,6 +2,7 @@ namespace manager; use \manager\Database; + use \manager\Authentification; class ModuleRequest{ @@ -37,7 +38,7 @@ * @return status Retourne si oui ou non tout s'est bien passe * */ - public function __construct($path=null, $params=null, $token=null){ + public function __construct($path=null, $params=null){ // Si pas parametre manquant, on quitte if( $path == null ){ $this->error = ManagerError::MissingPath; @@ -78,7 +79,7 @@ /* [3] Verification des droits =========================================================*/ - if( !$this->checkPermission($token) ) // Si on a pas les droits + if( !$this->checkPermission() ) // Si on a pas les droits return false; @@ -262,11 +263,6 @@ */ public static function fromPost($url, $post){ - /* [0] Verification de l'authentification - =========================================================*/ - // On definit le token - $token = isset($_SERVER['PHP_AUTH_DIGEST']) ? $_SERVER['PHP_AUTH_DIGEST'] : null; - /* [1] On verifie que le @path est renseigne =========================================================*/ /* (1) Si le path est dans @url */ @@ -303,7 +299,7 @@ /* [4] On retourne une instance de =========================================================*/ // On cree notre requete avec le token - return new ModuleRequest($post['path'], $params, $token); + return new ModuleRequest($post['path'], $params); } @@ -363,12 +359,10 @@ /* RETOURNE SI ON A LA PERMISSION D'EXECUTER CETTE METHODE * - * @token Token d'acces a l'API (OPTIONNEL) - * * @return permission Retourne si on a les droits ou pas pour executer cette methode * */ - private function checkPermission($token=null){ + private function checkPermission(){ /* [1] On recupere les informations utiles =========================================================*/ // On recupere le nom de la methode @@ -377,52 +371,20 @@ // Si aucune permission n'est definie if( !isset($method['permissions']) ) return true; - /* [2] Gestion si un @token est defini + + + /* [2] Vérification des permissions et de l'authentification =========================================================*/ - if( Database::check('sha1', $token) ){ + $granted = Authentification::permission($method['permissions']); - - /* (1) On verifie que le token est valide */ - $checkToken = new Repo('token/check', [$token] ); - $token_permissions = $checkToken->answer(); - - // Si le token est invalide, on retourne une erreur -> FAUX - if( $token_permissions === false ){ - $this->error = ManagerError::TokenError; - return false; - } - - $local_permissions = $token_permissions; - - - /* [3] Gestion si aucun token, avec utilisateur connecté - =========================================================*/ - }else if( isset($_SESSION['permission']) ) - $local_permissions = $_SESSION['permission']; - // Si ni token, ni SESSION, erreur - else{ + /* (1) On retourne FAUX si aucun droit n'a ete trouve */ + if( !$granted ){ $this->error = ManagerError::PermissionError; return false; } - - /* [4] Verification des droits parmi les permissions donnees - =========================================================*/ - /* (1) On recupere la liste des permissions possibles */ - $permissions = $method['permissions']; - - /* (2) Si aucune permission n'est definie, on laisse l'acces */ - if( count($permissions) == 0 ) return true; - - /* (3) On verifie qu'il y a au moins une permission ok */ - foreach($permissions as $permission) - if( in_array($permission, $local_permissions) ) return true; - - - /* [5] On retourne FAUX si aucun droit n'a ete trouve - =========================================================*/ - $this->error = ManagerError::PermissionError; - return false; + /* (2) On retourne VRAI si la permission est ok */ + return true; } diff --git a/manager/autoloader.php b/manager/autoloader.php index aac6a2a..74e74a2 100755 --- a/manager/autoloader.php +++ b/manager/autoloader.php @@ -78,15 +78,6 @@ /* [3] Gestion des authentifications et des droits =========================================================*/ - \manager\Authentification::init(); - - /* (0) Retourne le niveau de connexion */ - function authLevel(){ return !is_array($_SESSION['AUTH']) ? 0 : count($_SESSION['AUTH']); } - - /* (1) Retourne si l'utilisateur est connecte ou non */ - function connected(){ return isset($_SESSION['PERM']) && count($_SESSION['PERM']) > 0; } - - /* (2) Retourne si l'utilisateur a le status en question */ - function permission($type){ return connected() && in_array($type, $_SESSION['PERM']); } + \manager\Authentification::check(); ?> diff --git a/manager/module/userDefault.php b/manager/module/userDefault.php index d706831..4587880 100755 --- a/manager/module/userDefault.php +++ b/manager/module/userDefault.php @@ -335,8 +335,8 @@ $opt_data['lastname'], $opt_data['mail'], $opt_data['password'], - $opt_data['status']) - ]; + $opt_data['status'] + ]); return [ 'status' => $request->answer() ]; diff --git a/test/authTest.php b/test/authTest.php index 9f45a22..b6b14fb 100644 --- a/test/authTest.php +++ b/test/authTest.php @@ -1,9 +1,10 @@