Autoriser ou interdire une modification ?

Eléphant du PHP | 96 Messages

12 avr. 2006, 14:46

Bonjour,
J'affiche les données dans un tableau avec une icone qui permet au commercial de modifier les données de son client. Le commercial peut aussi consulter les données-clients des autres commerciaux. Ce que j'aimerais, c'est que le commercial puisse modifier uniquement que les données correspondants à ses clients...
Et je ne sais pas comment débuter. :roll:

Voilà mon icone qui permet de modifier les données-client :
<?php {
$lien5="index.php?liste=modifier&vente=".$vente['id_vente'];	 
afficher_url($lien5,"<img src=\"images/modif.gif\" width=\"21\" height=\"21\" border=\"0\"alt=\" Modifier la fiche de Mr ".$vente[1]." \">");
}?>
Et affichage de l'icone du commercial :
<?php
$com=$vente['idcommercial'];
$req_commer=mysql_query("select * from commercial where id_commercial='$com'");
$commer=mysql_fetch_array($req_commer);
$lien="index.php?liste=commercial_choisi&choix=commercial&com_choisi=".$commer['id_commercial'];    
afficher_url($lien,"<img src=\"images/com.gif\" width=\"21\" height=\"21\" border=\"0\"alt=\" Voir les ventes de ".$commer['commercial']." \">");?>
?>
Un début de piste ? :D Merci.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2006, 15:37

Deux solutions se projettent:

1. droits d'accès fixés par le programme
2. droits d'accès fixés du côté de la base de données

Solution 1:
L'idée est de ne pas afficher l'icône "modifier" pour les données clients qui ne concernent pas le commercial connecté
Pour celà, le commercial doit ouvrir une session authentifiée par un ID qui lui est propre.
Une requête SELECT des données clients doit pouvoir distinguer les clients sous la responsabilité du commercial pour n'afficher l'icône "modifier" que dans ce cas.

Une association Client/Commercial doit exister dans la base pour réussir le filtrage attendu.
En fait, dans la table "Client" il faut ajouter une clé étrangère qui identifie le commercial (son ID)

Solution 2:
Plus complexe que la première, mais plus sécurisée car indépendante du programme.
Cette solution consiste à créer un modèle de données sécurisé qui regroupe les clients par commercial dans des tables propres aux commerciaux.
Les commerciaux deviennent des utilisateurs de ces tables, on doit les créer alors dans la table des utilisateurs du SGBD. ce qui n'exclut pas le besoin de créer une table "commerciaux" qui contient l'identité complète du commercial. Le SGBD a besoin simplement de reconnaitre le commercial en tant qu'utilisateur pour valider ses accès.
Pour cela, il suffit de créer des ID utilisateurs correspondants aux ID des commerciaiux enregistrés

Le fait de distribuer les clients dans des tables portant les ID des commerciaux on peut assigner des droits d'accès SQL (SELECT, INSERT, UPDATE ou DELETE)

On peut automatiser ces taches en utilisant un trigger (programme SQL) qui se déclenche quand un commercial est ajouté dans la table "commerciaux". Je récapitule les taches à faire pour un commercial:
  • Si le nouveau commercial est ajouté :
    1. Créer une nouvelle table "client_xxx" où xxx est l'ID du nouveau commercial
    2. Ajouter l'ID du commercial dans la table des utilisateurs du SGBD pour ainsi créer un utlisateur authentifié de la base de données
    3. Donner au nouveau commercial/utilisateur par le biais de son ID le droit de lecture sur toutes les tables "client_xxx" des commerciaux y compris la sienne et le droit d'ajout/modification/suppression sur seulement la sienne
Exemple :
Soit : com1 et com2 deux commerciaux enregistrés en tant qu'utilisateurs dans le SGBD

On peut créer donc 2 tables : client_com1 et client_com2 : qui contiennent les données des clients de chaque commercial

et une table "commerciaux" qui contient 2 lignes d'infos complètes pour com1 et com2

En suite, il faut donner le droit "SELECT" (lecture) sur les 2 tables client_com1 et client_com2 pour les 2 commerciaux.

et les droits "INSERT, UPDATE et DELETE" pour chaque commercial sur sa table propre (com1 pour client_com1 et com2 pour client_com2)

Les droits SQL sont fixés par la command "GRANT"

Dans le programme, quand un commercial se connecte, une requête select est envoyée sur toutes les tables client tout commercial confondu.
L'icône "Modifier" ne doit être affichée que pour les données issues de la table "client_xxx" (où : xxx est l'ID ou le nom du commercial connecté)

Cette solution intègre bien sur la solution 1 mais elle est plus sécurisée.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 96 Messages

12 avr. 2006, 16:21

Salut, en fait j'ai déjà 2 tables qui sont bien remplies.
La table vente :

Code : Tout sélectionner

CREATE TABLE `vente` ( `id_vente` int(11) NOT NULL auto_increment, `client` varchar(100) NOT NULL default '', `idsecteur` int(11) default NULL, `commune` varchar(50) default NULL, `date` varchar(50) default NULL, `idcategorie` int(11) default NULL, `adresse` blob, `idcommercial` int(11) default NULL, `idannexe` int(11) default NULL, `idfondation` int(11) default NULL, `idsol` int(11) default NULL, `idtoiture` int(11) default NULL, `idmillesime` int(11) default NULL, `idgeotechnicien` int(11) default NULL, `notes` text, `surface` varchar(150) default NULL, `profondeur` varchar(50) default NULL, PRIMARY KEY (`id_vente`), FULLTEXT KEY `client` (`client`), FULLTEXT KEY `commune` (`commune`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Détails des ventes' AUTO_INCREMENT=330 ;
Et la table commercial :

Code : Tout sélectionner

CREATE TABLE `commercial` ( `id_commercial` int(11) NOT NULL auto_increment, `commercial` varchar(50) NOT NULL default '', PRIMARY KEY (`id_commercial`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Les commerciaux' AUTO_INCREMENT=280 ;
Ce qui devrait correspondre a ce que tu me dis...donc il faut que je
passe par des sessions ?