IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DB2 Discussion :

Connexion unique à une base de données


Sujet :

DB2

  1. #1
    Membre habitué Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Points : 187
    Points
    187
    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

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 63
    Points
    63
    Par défaut
    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.


  3. #3
    Membre habitué Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Points : 187
    Points
    187
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 63
    Points
    63
    Par défaut
    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.

  5. #5
    Membre habitué Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Points : 187
    Points
    187
    Par défaut
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 63
    Points
    63
    Par défaut
    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

  7. #7
    Membre habitué Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Points : 187
    Points
    187
    Par défaut
    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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    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

  9. #9
    Membre habitué Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Points : 187
    Points
    187
    Par défaut
    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

  10. #10
    Membre habitué Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Points : 187
    Points
    187
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] connexion unique à une base de donnée
    Par supcomingenieur dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 31/05/2013, 19h56
  2. Connexion sur une base de données Postgre
    Par ktox dans le forum C++Builder
    Réponses: 3
    Dernier message: 04/08/2005, 10h58
  3. [DataBase]Connexion a une base de données.
    Par GETah dans le forum JDBC
    Réponses: 3
    Dernier message: 19/04/2005, 17h47
  4. connexion a une base de donné mysql
    Par ithery75 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/02/2005, 20h57
  5. connexion a une base de donnée distante mysql(site internet)
    Par rollernox dans le forum Bases de données
    Réponses: 2
    Dernier message: 06/07/2004, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo