Gestion automatique pour l'API des authentifications ('warehouse' uniquement, 'admin' à faire) + permissions classiques

This commit is contained in:
xdrm-brackets 2016-07-04 17:23:19 +02:00
parent 3e95721ca7
commit 4a412db81a
6 changed files with 88 additions and 71 deletions

View File

@ -144,7 +144,7 @@
"getById": { "getById": {
"description": "Retourne un utilisateur spécifique.", "description": "Retourne un utilisateur spécifique.",
"permissions": [], "permissions": ["warehouse"],
"parameters": { "parameters": {
"id_user": { "description": "UID de l'utilisateur.", "type": "id" } "id_user": { "description": "UID de l'utilisateur.", "type": "id" }
}, },

View File

@ -22,7 +22,7 @@
* *
* *
*/ */
public static function init(){ public static function check(){
/* (1) Initialisation /* (1) Initialisation
---------------------------------------------------------*/ ---------------------------------------------------------*/
if( !isset($_SESSION['AUTH']) ) $_SESSION['AUTH'] = []; if( !isset($_SESSION['AUTH']) ) $_SESSION['AUTH'] = [];
@ -56,7 +56,7 @@
/* (4) On vérifie l'authentification par BDD /* (4) On vérifie l'authentification par BDD
---------------------------------------------------------*/ ---------------------------------------------------------*/
if( !self::check() ) if( !self::deepCheck() )
$_SESSION['AUTH'] = []; $_SESSION['AUTH'] = [];
} }
@ -67,15 +67,15 @@
* *
* *
*/ */
public static function check(){ public static function deepCheck(){
/* [1] Si aucune authentification /* [1] Si aucune authentification
=========================================================*/ =========================================================*/
if( authLevel() == 0 ) if( self::auth() == 0 )
return false; return false;
/* [2] Si authentification unique /* [2] Si authentification unique
=========================================================*/ =========================================================*/
if( authLevel() >= 1 ){ if( self::auth() >= 1 ){
$checkRoot = new Repo('warehouse/getByToken', [ $_SESSION['AUTH'][0] ]); $checkRoot = new Repo('warehouse/getByToken', [ $_SESSION['AUTH'][0] ]);
// Si le token n'existe pas // Si le token n'existe pas
@ -85,7 +85,7 @@
/* [3] Si authentification double /* [3] Si authentification double
=========================================================*/ =========================================================*/
if( authLevel() >= 2 ){ if( self::auth() >= 2 ){
$checkBranch = new Repo('admin/getByToken', [ $_SESSION['AUTH'][1] ]); $checkBranch = new Repo('admin/getByToken', [ $_SESSION['AUTH'][1] ]);
// Si le token n'existe pas // Si le token n'existe pas
@ -99,6 +99,69 @@
} }
/* VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
*
* @expected<array> Liste des permissions attendues
*
* @return status<Boolean> 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<int> Niveau d'authentification (0 à 2)
*
*/
public static function auth(){
return !is_array($_SESSION['AUTH']) ? 0 : count($_SESSION['AUTH']);
}
} }
?> ?>

View File

@ -2,6 +2,7 @@
namespace manager; namespace manager;
use \manager\Database; use \manager\Database;
use \manager\Authentification;
class ModuleRequest{ class ModuleRequest{
@ -37,7 +38,7 @@
* @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, $token=null){ public function __construct($path=null, $params=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;
@ -78,7 +79,7 @@
/* [3] Verification des droits /* [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; return false;
@ -262,11 +263,6 @@
*/ */
public static function fromPost($url, $post){ 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] On verifie que le @path est renseigne
=========================================================*/ =========================================================*/
/* (1) Si le path est dans @url */ /* (1) Si le path est dans @url */
@ -303,7 +299,7 @@
/* [4] On retourne une instance de <ModuleRequest> /* [4] On retourne une instance de <ModuleRequest>
=========================================================*/ =========================================================*/
// On cree notre requete avec le token // 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 /* 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($token=null){ private function checkPermission(){
/* [1] On recupere les informations utiles /* [1] On recupere les informations utiles
=========================================================*/ =========================================================*/
// On recupere le nom de la methode // On recupere le nom de la methode
@ -377,52 +371,20 @@
// Si aucune permission n'est definie // Si aucune permission n'est definie
if( !isset($method['permissions']) ) return true; 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 retourne FAUX si aucun droit n'a ete trouve */
/* (1) On verifie que le token est valide */ if( !$granted ){
$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{
$this->error = ManagerError::PermissionError; $this->error = ManagerError::PermissionError;
return false; return false;
} }
/* (2) On retourne VRAI si la permission est ok */
/* [4] Verification des droits parmi les permissions donnees return true;
=========================================================*/
/* (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;
} }

View File

@ -78,15 +78,6 @@
/* [3] Gestion des authentifications et des droits /* [3] Gestion des authentifications et des droits
=========================================================*/ =========================================================*/
\manager\Authentification::init(); \manager\Authentification::check();
/* (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']); }
?> ?>

View File

@ -335,8 +335,8 @@
$opt_data['lastname'], $opt_data['lastname'],
$opt_data['mail'], $opt_data['mail'],
$opt_data['password'], $opt_data['password'],
$opt_data['status']) $opt_data['status']
]; ]);
return [ 'status' => $request->answer() ]; return [ 'status' => $request->answer() ];

View File

@ -1,9 +1,10 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) ); <?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php'; require_once __ROOT__.'/manager/autoloader.php';
use \manager\Authentification;
var_dump($_SESSION['AUTH']); var_dump($_SESSION['AUTH']);
var_dump( authLevel() ); var_dump( Authentification::auth() );
?> ?>