Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 11/09/2006, 16h10   #1
Membre habitué
 
Avatar de bouchette63
 
Inscription : mai 2006
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 257
Points : 143
Points : 143
Par défaut Connexion unique à une base de données

Bonjour,

Je viens demander votre aide, car ce domaine n'est pas ma spécialité.

J'ai participé à la conception d'un progiciel d'administration, qui s'occuppe de gérer les paramètres d'une base de données (insertion, suppression et modification de données). J'utilise Hibernate pour me connecter à ma base à partir de mon application, et un pool de connexion C3PO.

J'aimerais en fait qu'une seule et unique personne puisse se connecter à ma base DB2 pour travailler dessus à partir de mon application.
Mais je ne sais pas trop comment m'y prendre pour réaliser cette contrainte, peut-être en créant une nouvelle table avec un identifant de connectivité ?

Est-ce que quelqu'un à une idée pour mettre en oeuvre ceci ?

Merci pour votre aide.
__________________
"Tout m'afflige, et me nuit, et conspire à me nuire" Racine
bouchette63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 13h09   #2
Membre du Club
 
Inscription : août 2006
Messages : 56
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2006
Messages : 56
Points : 55
Points : 55
Rien de plus simple!

Tu défini la personne qui doit accéder la DB comme utilisateur sur ton serveur DB2.
Losrque c'est fait, tu ajoute cet utilisateur dans la liste des "USER" de DB2 sur la DB qu'il doit pouvoir accéder et tu lui donne le droit de "CONNECT".
Ensuite pour chaque table de la db, tu lui donne les droits "SELECT", "INSERT", "UPDATE","DELETE" selon ton bon plaisir, ou suivant les besoins de ton application.

Pour faire cela, tu dois évidement être au minimum DBADM sur cette DB.
L'utilisateur devra bien évidement d'identifier dans ton application lors du "CONNECT" à la DB.

ALHER est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 16h44   #3
Membre habitué
 
Avatar de bouchette63
 
Inscription : mai 2006
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 257
Points : 143
Points : 143
Merci pour ta réponse ALHER,

Je ne sais pas en fait si c'est le meilleur moyen pour réaliser ce que je souhaite.
Je m'explique : dans mon application, j'ai le fichier de configuration Hibernate (hibernate.cfg.xml). A l'intérieur de celui ci, on définit les fichiers de mappings et la connexion à ma base de données (driver, user, password...). Soit :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<hibernate-configuration>
    <session-factory name="java:/hibernate/HibernateFactory">
 
	<property name="dialect">net.sf.hibernate.dialect.DB2Dialect</property>	
 
	<!-- Connexion à ma base de données -->
	<property name="connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
	<property name="connection.url">myURL</property>
	<property name="connection.username">myUser</property>
	<property name="connection.password">myPassword</property>
	<property name="default_schema">mySchema</property>		
 
	<property name="show_sql">false</property>
 
        // Fichiers de mapping
        <mapping resource="hibernate-config/DbEntiteAvecDroit.hbm.xml"/>
        <mapping resource="hibernate-config/DbControleDAcces.hbm.xml"/>
        etc...
 
    </session-factory>
</hibernate-configuration>
Le problème c'est que lorsque l'on met en marche l'application, on se connecte forcément avec le même nom d'utilisateur et mot de passe.
Pour limiter l'appli à une seule personne ce n'est pas génial.

- Peut-être est-il possible de définir ces paramètres de manière dynamique (pas sûr).
- Ou bien ajouter une nouvelle table qui définit un ID de connectivité et un booléen, et si ce dernier est à true, on rejette le nouvel utilisateur qui veux utiliser l'application.
- Sinon on peut spécifier une authentification au projet, je crois que l'on peut faire cela avec LDAP (je ne connais pas du tout)
- etc...


Qu'est-ce que vous me conseillez de faire ?
Pour que se soit le plus simple et efficace possible à réaliser

Merci pour votre aide.
__________________
"Tout m'afflige, et me nuit, et conspire à me nuire" Racine
bouchette63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 18h30   #4
Membre du Club
 
Inscription : août 2006
Messages : 56
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2006
Messages : 56
Points : 55
Points : 55
Si myuser et mypassword sont rempli par le client , et qu'ils n'exitent pas sur le serveur DB2 en dans l'attribution des droits sur la DB et les tables, DB2 va retourner un code erreur lors de la tentative de connection qui n'aura pas lieu.

Si par contre, c'est bien l'utisateur defini dans les droits, alors l'application fonctionnera normalement.

Il suffit donc de traquer le code errreur du connect.
ALHER est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2006, 10h47   #5
Membre habitué
 
Avatar de bouchette63
 
Inscription : mai 2006
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 257
Points : 143
Points : 143
Merci pour ta réponse,

J'ai réfléchi un peu plus à ta solution et il y a quand même une faille.
Supposons que l'on ai une combinaison unique User/Password qui puisse se connecter à l'application, pour effectuer les modifications sur la base. Cela n'empêchera pas à plusieurs utilisateurs de se connecter en même temps, avec la même combinaison User/Password . Ce qui est problématique dans mon cas.
(oui j'ai cherché la petite bête )

Donc ce n'est pas une solution sans faille, d'ailleur est-ce que ça existe ?
Mais cette dernière est intéressante, à voir...

Sinon pour l'instant j'essaye de regrouper différentes méthodes pour régler mon problème.Ceci me permettant de faire un comparatif entre elles et de voir quelle est la meilleure dans mon cas. Donc si d'autres personnes ont des idées, n'hésitez pas à la proposer

Merci à vous.
__________________
"Tout m'afflige, et me nuit, et conspire à me nuire" Racine
bouchette63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2006, 14h29   #6
Membre du Club
 
Inscription : août 2006
Messages : 56
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2006
Messages : 56
Points : 55
Points : 55
Citation:
J'ai réfléchi un peu plus à ta solution et il y a quand même une faille.
Supposons que l'on ai une combinaison unique User/Password qui puisse se connecter à l'application, pour effectuer les modifications sur la base. Cela n'empêchera pas à plusieurs utilisateurs de se connecter en même temps, avec la même combinaison User/Password . Ce qui est problématique dans mon cas.
(oui j'ai cherché la petite bête )
En effet, tu as raison.


une
Dans ce cas tu peux toujours créer une table avec une valeur "sémaphore" et forcer l'application a lire le contenu avant de faire autre chose et le mettre a jour si il est l'unique utlisateur.
Evidement il faudra prévoir les cas de réinitialisation, de reset, etc...

une autre
Tu peux aussi t'arranger pour que les accès en update soit "Exclusif" et réserve toute la DB, il y a des clauses dans les ordres select pour cela si je me rappelle bien. Tant que la transaction n'est pas "Commit" ou "Rollback", la DB est bloquée. Tu joue alors avec les options de "Cursor Stability", mais tu risque de pourrir tes performances à cause des "deadlock".

Le contrôle des pages est moins bien adapté sous Windows/linux que sur Z/os.

Bonne réflection
ALHER est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2006, 15h07   #7
Membre habitué
 
Avatar de bouchette63
 
Inscription : mai 2006
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 257
Points : 143
Points : 143
Merci pour ton aide ALHER ,

Je vais voir tout ça, en essayant d'opter pour quelque chose de performant et simple à mettre en oeuvre.
Je vous dirais pour quel solution j'ai jetté mon dévolu.

Mais si vous avez des propositions n'hésitez pas
__________________
"Tout m'afflige, et me nuit, et conspire à me nuire" Racine
bouchette63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 14h20   #8
Membre à l'essai
 
Inscription : décembre 2004
Messages : 21
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 21
Points : 23
Points : 23
Bonjour je me pose une question ?
Avec hibernate et un pool de connexion,
la connexion ou les connexions (si tu as autorisé plusieurs connexion à la base dans ton pool) n'est elle pas partagé par ton application?
C'est a dire si 5 clients attaque un seul serveur d'application ils peuvent utilisé qu'une seule connexion de ton pool.

Je vois pas trop comment sinon a part en system sur le réglage en aval du serveur d'application pour n'accepter qu'un seul client.

Désolé
Bonne réflexion
rouner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 14h59   #9
Membre habitué
 
Avatar de bouchette63
 
Inscription : mai 2006
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 257
Points : 143
Points : 143
Effectivement oui, en ce qui concerne un pool de connexion, les connexions sont partagées entre tous les utilisateurs, même si tu n'as qu'une seule connexion dans ton pool, dès que ta requête est achevée, l'application appelante rend la connexion qui est disponible pour une autre personne

Par contre j'ai trouvé une solution intéressante en utilisant l'Id de connexion utilisateur qui est unique pour chaque personne qui se connecte à l'application. Plus d'infos quand j'aurais approfondis mes recherches
__________________
"Tout m'afflige, et me nuit, et conspire à me nuire" Racine
bouchette63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 15h16   #10
Membre habitué
 
Avatar de bouchette63
 
Inscription : mai 2006
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 257
Points : 143
Points : 143
Bon alors, la méthode que j'ai trouvé est pas mal je trouve.

Principe :

1) On crait une table DBCONNEXION qui va nous servir à stocker l'ID session utilisateur (qui est unique) et la date de la dernière modification dans la base de données.

2) A l'initialisation de l'application, on récupère l'ID session utilisateur nouvellement créé et on le compare avec celui de la base de donnée. Si celui-ci est différent, on récupère la date de la derniere modification.

Deux choix sont alors possible :
Code :
1
2
3
. A > B - C : seule la consultation est autorisée
 
. A < B - C : ON remplace l'Id de session utilisateur enregistré dans la base par celui qui vient de se connecter
A : date de la dernière modification dans la base (celle stockée dans la table DBCONNEXION)
B : date de la connexion du nouvel utilisateur
C : temps avant la déconnexion automatique

3) On désactive les boutons de validation/suppression si l'ID de session utilisateur est différent de celui enregistré dans la base de données.

4) On met à jour la date dernière activité dans DBCONNEXION à chaque fois que l'on modifie la base.

5) Si l'utilisateur qui a les modifs souhaite quitter l'application, un bouton de déconnexion est à sa disposition. Ceci permet ainsi de libérer la connexion en modification. Ce qui permettra au prochain utilisateur qui se connectera, de pouvoir avoir la possibilité de faire des modifs.

Voila,
Si vous avez des remarques ou un avis n'hésitez pas
__________________
"Tout m'afflige, et me nuit, et conspire à me nuire" Racine
bouchette63 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 16h51.


 
 
 
 
Partenaires

Hébergement Web