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": {
"description": "Retourne un utilisateur spécifique.",
"permissions": [],
"permissions": ["warehouse"],
"parameters": {
"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
---------------------------------------------------------*/
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<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;
use \manager\Database;
use \manager\Authentification;
class ModuleRequest{
@ -37,7 +38,7 @@
* @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
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 <ModuleRequest>
=========================================================*/
// 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<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($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;
}

View File

@ -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();
?>

View File

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

View File

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