Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/08/2006, 14h05   #1
Membre éclairé
 
Avatar de soad
 
Inscription : février 2004
Messages : 500
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2004
Messages : 500
Points : 333
Points : 333
Par défaut [Utilisateur] bloquer des lignes

Hello tout le monde..

Est ce qu'il est possible de créer des utilisateurs sous mysql et de leur autorisé l'accès uniquement sur certaine ligne ?

par exemple uniquement sur les lignes qu'il ont créer eux meme ?

Si c'est pas possible comment faite vous pour protéger les données présent dans la base de donnée ?

merci
soad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 15h00   #2
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Salut,

Il n'est pas possible de savoir de manière simple qui a inséré telle ou telle ligne. En revanche on peut créer une vue qui ne comportera que certaines lignes de la table d'origine, et ne donner au user que les privilèges sur cette vue et pas la table (plus d'explications ici).

Sinon, par utilisateur tu entends utilisateur de la base de données ou de l'application ?
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 16h02   #3
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Bonjour,

J'aurais peut-être une solution, qui a certes ses inconvénients. Le premier étant qu'il faut utiliser MySQL >= 5.

Comme le dit Maximilian, on ne connaît pas qui a inséré les lignes. Donc la première chose à faire serait de rajouter une colonne "Utilisateur" (VARCHAR(80) devrait être bon) à la table. Ensuite, à chaque insertion, on appelle USER() pour stocker l'utilisateur qui exécute la requête :

Code :
INSERT INTO client VALUES (..., ..., USER());
Ensuite, on crée donc une vue où tous les utilisateurs auront le privilège SELECT :
Code :
CREATE VIEW mes_clients AS SELECT col1, col2, ... FROM client WHERE utilisateur = USER();
Eh voilà : à chaque fois qu'un utilisateur fera :
Code :
SELECT * FROM mes_clients
il obtiendra les infos des clients qu'il a insérés dans la table Client.

Les inconvénients qui me viennent à l'esprit :
  • si on modifie un utilisateur (username), il faut modifier la table Client
  • ca prend quand même beaucoup de place si on a beaucoup de clients !
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 19h35   #4
Membre éclairé
 
Avatar de soad
 
Inscription : février 2004
Messages : 500
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2004
Messages : 500
Points : 333
Points : 333
Citation:
Envoyé par Maximilian
Sinon, par utilisateur tu entends utilisateur de la base de données ou de l'application ?
Des utilisateurs de la base de donnée !

Pcq en faite j'aimerais faire une appli qui se connecte directement à la base ! Les utilisateurs auront un login et un mot de passe que j'aurais auparavant créer sous mysql !

Le problème avec l'enregistrement du user dans la table c'est que j'ai pas mal de table ! j'me vois pas trop le stoquer dans chaque !

Ou alors j'ai pensé faire une base de donnée par personne mais bon ca me parait un peu lourd, non ?
soad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 19h49   #5
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Citation:
Envoyé par soad
Le problème avec l'enregistrement du user dans la table c'est que j'ai pas mal de table ! j'me vois pas trop le stoquer dans chaque !

Ou alors j'ai pensé faire une base de donnée par personne mais bon ca me parait un peu lourd, non ?
Ca prendra moins de place, c'est sûr. Mais à gérer, c'est sûrement pas mieux.

A chaque changement des utilisateurs (ajout par exemple), il va sûrement te falloir changer certaines tes requêtes pour prendre en compte la nouvelle base. Je pense notamment si tu as un utilisateur "admin" qui peut accéder à tous les enregistrements dans ton appli.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2006, 16h29   #6
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
A mon avis tout dépend de ton appli :

- Si c'est une sorte de PHPMyAdmin où les utilisateurs saisissent des commandes SQL, alors tu seras obligé comme la plupart des hébergeurs d'avoir une table ou une base par user.
Tu peux tester la solution de Biglo mais c'est vrai que ça risque d'être un peu lourd au niveau performances (et le WHERE utilisateur = USER() n'est-il pas interprété au moment de la création de la vue ?)

- Pour une appli plus classique, avoir un user SGBD pour chaque user du programme est une assez mauvaise idée. En effet le SGBD n'est pas (encore ?) un outil assez perfectionné pour intégrer les règles de gestion selon lesquelles tel utilisateur a accès à telles ou telles données précises. Pour preuve les problèmes de privilèges sur des lignes.
Ce boulot relève plus de la logique métier codée dans l'application.
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2006, 16h50   #7
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Citation:
Envoyé par Maximilian
et le WHERE utilisateur = USER() n'est-il pas interprété au moment de la création de la vue ?
Pas de soucis de ce côté. Les expressions sont interprétées à l'exécution de la requête.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2006, 18h00   #8
Membre éclairé
 
Avatar de soad
 
Inscription : février 2004
Messages : 500
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2004
Messages : 500
Points : 333
Points : 333
Citation:
Envoyé par Biglo
Ca prendra moins de place, c'est sûr. Mais à gérer, c'est sûrement pas mieux.
C'est vrai que coté maintenance c'est pas super !


Citation:
Envoyé par Maximilian
A mon avis tout dépend de ton appli :

- Si c'est une sorte de PHPMyAdmin où les utilisateurs saisissent des commandes SQL, alors tu seras obligé comme la plupart des hébergeurs d'avoir une table ou une base par user.
Tu peux tester la solution de Biglo mais c'est vrai que ça risque d'être un peu lourd au niveau performances (et le WHERE utilisateur = USER() n'est-il pas interprété au moment de la création de la vue ?)

- Pour une appli plus classique, avoir un user SGBD pour chaque user du programme est une assez mauvaise idée. En effet le SGBD n'est pas (encore ?) un outil assez perfectionné pour intégrer les règles de gestion selon lesquelles tel utilisateur a accès à telles ou telles données précises. Pour preuve les problèmes de privilèges sur des lignes.
Ce boulot relève plus de la logique métier codée dans l'application.
Les utilisateurs ne peuvent pas exécuter de code SQL mais le risque c'est qu'il se connecte avec autres chose que l'appli !


On peut faire des triggers avec les dernières version de mysql ou bien ?
Est ce qu'on peut déclencher un trigger sur une requête de sélection ?
soad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2006, 18h44   #9
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Citation:
Envoyé par soad
On peut faire des triggers avec les dernières version de mysql ou bien ?
Est ce qu'on peut déclencher un trigger sur une requête de sélection ?
On peut créer des triggers depuis la version 5, mais qui se déclenchent avant/après une insertion, modification ou suppression.

Que veux-tu faire ? Tu peux peut-être créer une procédure qui ferait le traitement que tu désires, puis qui génère le résultat du SELECT.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 11h25   #10
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Citation:
Envoyé par soad
Les utilisateurs ne peuvent pas exécuter de code SQL mais le risque c'est qu'il se connecte avec autres chose que l'appli !
Tu penses à quoi en particulier ? Question sécurité il me semble qu'il y a des parades bien plus efficaces et moins lourdes que ce que tu essaies de mettre en place...
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 13h20   #11
Membre éclairé
 
Avatar de soad
 
Inscription : février 2004
Messages : 500
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2004
Messages : 500
Points : 333
Points : 333
Citation:
Envoyé par Biglo
On peut créer des triggers depuis la version 5, mais qui se déclenchent avant/après une insertion, modification ou suppression.

Que veux-tu faire ? Tu peux peut-être créer une procédure qui ferait le traitement que tu désires, puis qui génère le résultat du SELECT.
En faite je pensais remplacer les vue par un trigger qui contrôle qu'on ne fasse pas un sélect sur des données autres que les siens ! Mais bon c'est plus simple les vue a mon avis !


Citation:
Envoyé par Maximilian
Tu penses à quoi en particulier ? Question sécurité il me semble qu'il y a des parades bien plus efficaces et moins lourdes que ce que tu essaies de mettre en place...
Bon pour finir je pense que je vais faire des pages php qui ferons le liens entre mysql et mon appli ! comme ca j'aurais plus de problème !
soad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h55.


 
 
 
 
Partenaires

Hébergement Web