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

PHP & Base de données Discussion :

[MySQL]Conception de connexion a plusieurs bases de données [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut [MySQL]Conception de connexion a plusieurs bases de données
    Bonjour,

    Le titre n'est pas vraiment explicite je sais, je n'ai pas trouvé mieux.

    Je suis en train de concevoir un site de type "gestion de données commerciale", un front office "catalogue de produit" et un backoffice de gestion du site et des données.

    J'ai un problème de conception au niveau de la connexion aux bases de données.

    Mon site s'adresse à des magasins, chaque magasin comprenant un certains nombre d'utilisateur du site. Lorsqu'un de ces utilisateurs veut se connecter, j'aimerai identifier la base de données à laquelle il veut se connecter mais sans lui demander, juste via son identifiant et son mot de passe.

    C'est là que je bloque.
    Chaque magasin possédant sa propre base de données, j'avais pensé faire une base spécifique à la détection de l'utilisateur qui me renverrait les informations concernant la base de données du magasin à laquelle mon site doit se connecter pour afficher les informations.

    Mais je ne vois absolument pas comment conserver mes informations tout en les protégeant, je ne veux pas passer des identifiants de connexion à une BD en POST ou GET ou autre.
    J'avais pensé à une variable superglobale PHP mais là encore je ne vois pas comment le mettre en place.

    Mon cerveau surchauffe je me perds dans mes réflexions, si quelqu'un peut m'apporter un peu de liquide de refroidissement il est le bienvenu!
    I want to break frite ~~ Chocolat....chocolat...CHOCOLAAAAAAAAAAT!!!

  2. #2
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Pourquoi ne pas tenter une solution "à la dure" tu test une base de données et si ça ne marche pas tu enchaîne avec la suivante !

    (Je plaisante )
    Tu cherches donc à savoir quel user doit se connecter à quel base de données, lorsqu'un utilisateur souhaite se connecté tu ne récupère que son couple loggin / password ? Tu n'as aucun élément qui pourrait te permettre d'identifier la base de données, comme une url spécifique ?

    Une autre solution serrait de créer une base de données contenant tous les user avec la base de données à lequel il est rattaché, mais gare au doublon ...
    Si un même loggin peut être présent dans plusieurs base de données alors tu n'as pas le choix tu vas devoir envoyer une donnée à la connexion te permettant d'identifier la bonne base ...

  3. #3
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Merci humitake de ta réponse

    Oui c'est ce que je me disais aussi, mais pour parer à ce problème de doublon je me disais que l'idée serait de faire une base dites de "connexion" qui contiendrais tout les utilisateurs de toutes les bases de données magasin (oui c'est...comment dire, imposant non?), ainsi que les identifiants de connexion à ces bases.

    Du coup comme la vérif se fait sur une seule base, pas de problème de doublon mais on réduit le nombre de login possible.
    Du coup lors du login, dans mon constructeur d'objet connexion je vais fouiller dans ma base de données pour pouvoir récupérer les identifiants de connexion BD client et effectuer les requêtes SQL. Mais ça reste un peu lourd.

    Et sinon, autre solution comme tu proposes, mettre une liste déroulante avec tout les magasins (et donc base de données) afin que celui qui veut se connecter sélectionne la BD.
    Malheureusement cette solution ne m'enchante pas car elle entraine que n'importe quel utilisateur pourrait voir tout les autres magasins qui sont clients de mon site.
    Alors il reste quoi, une zone de saisie? C'est ce qui me parait le plus simple, même si cela entraine une surcharge de saisie pour l'utilisateur.

    Qu'en penses-tu?
    I want to break frite ~~ Chocolat....chocolat...CHOCOLAAAAAAAAAAT!!!

  4. #4
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Citation Envoyé par Emyleen
    Mon site s'adresse à des magasins, chaque magasin comprenant un certains nombre d'utilisateur du site. Lorsqu'un de ces utilisateurs veut se connecter, j'aimerai identifier la base de données à laquelle il veut se connecter mais sans lui demander, juste via son identifiant et son mot de passe.
    Les utilisateurs dont tu parle peuvent-ils dans un cas posséder plusieurs comptes, entendre par la un comptes par magasin ? Ou un utilisateur ne dispose que d'un compte pour la magasin auquel il est affilié ?

    Car une solution à laquelle j'ai pensé, mais je ne sais pas si elle est envisageable dans ton cas, serait de fournit une url spécifique pour un magasin. Sa fonctionnerais dans le cas ou tu dit par exemple au employé de carrefour de se connecter à l'url carrefour.gestion.com et ceux de auchan à l'url auchan.gestion.com.
    Mais cela rejoins un peu l'idée de la zone de saisie.


    Edit : Une petite idée vient de jaillir de mon esprit
    Sinon pourquoi ne pas ajouter un préfixe au loggin qui te fournirais l'information de la base de donnée ?
    Par exemple carrefour.loggin, ainsi un explode sur le . te permet d'identifier la base de données et de t'y connecter.

  5. #5
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Très bonne question! Je n'ai pour l'instant pas envisagé de permettre à un utilisateur de se connecter à plusieurs magasins différents. Mais néanmoins cela reste possible, qu'on utilise une url spécifique ou un champs de saisie de magasin, puisque de toute façon j'irai chercher dans ma BD les identifiants de connexion correspondants.
    Un utilisateur pourra donc être relié à autant de Magasins que désiré, puisqu'on spécifie lors du login à quelle base on souhaite se connecter.

    J'utilise PDO afin de me connecter à ma BD, j'avais pensé insérer la vérification de la base de données demandée lors de la construction de l'appel à ma BD 'connexion', ce qui me permettrait de récupérer (toujours dans mon constructeur) les identifiant de connexion à la BD Magasin, de m'y connecter, d'effectuer la requête, de récupérer le résultat et de le retourner, tout ça encapsulé dans mon constructeur de connexion à ma BD pour éviter les hack.
    Penses-tu que cette solution soit assez sécurisée?

    Edit : je viens de voir ton idée, elle n'est pas mauvaise du tout ça ne ferait qu'un seul login à retenir pour l'utilisateur, ce qui n'est pas plus mal
    I want to break frite ~~ Chocolat....chocolat...CHOCOLAAAAAAAAAAT!!!

  6. #6
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Niveau sécurité je ne suis pas un expert, mais je dirais que c'est plutôt bien pensé, ainsi tout est effectué par le constructeur et il ne peut pas y avoir d'action dessus.

  7. #7
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Bon je vais essayer ça, je reviendrais pour confirmer si ça répond à mes attentes merci encore humitake

    Edit : Avant d'oublier de valider on sait jamais avec ma mémoire de poisson rouge, je met le sujet en résolu, je le rouvrirai en cas de cas (même si je penses qu'on est arrivé à la solution la plus pertinente) ^^
    I want to break frite ~~ Chocolat....chocolat...CHOCOLAAAAAAAAAAT!!!

  8. #8
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Alors j’attends ton retour

  9. #9
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    J'ai essayé de mettre en place notre solution, mais je bloque dans le code.

    Code php : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    public function __construct ($bd,$login, $password) {
            try 
            {			
    			//Si on a des arguments on est dans la première ouverture de session
                if(isset($bd) && !empty($bd)){
    				$this->connexion = parent::__construct($this->getDns(), $this->login, $this->password);
    				// pour mysql on active le cache de requête
    				if($this->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql')
    					$this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    				return $this->connexionSpecifique($bd,$login,$password);
    			}
    			else {
    				//Récupération des données en session
    				$this->connexion = parent::__construct('mysql:dbname='.$_SESSION['nomBd'].';host='.$this->nomServeur.';', $_SESSION['login'], $_SESSION['password']);
    				// pour mysql on active le cache de requête
    				if($this->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql')
                    	$this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    				return $this->connexion;
    			}
            }
            catch(PDOException $e) {
               //Afficher un message d'erreur
    		   echo "Erreur de construction de la connexion.";
            }
        }
     
    	function connexionSpecifique($bd,$login,$password){
    		$sql = "SELECT b.*, u.ID AS idUser FROM Bases AS b, RelBaseUtilisateur AS r, Utilisateurs AS u
    				WHERE u.Login = '".$login."'
    				AND u.Password = '".$password."'
    				AND r.IdUtilisateur = u.ID
    				AND r.IdBase = b.ID";
    		$result = $this->executeQuery($sql);
     
    		//Si on a le même utilisateur et mot de passe dans plusieurs BD
    		foreach($result as $base){
    			if($base['nomBd'] == $bd){
    				$baseSpecifique = $base;
    			}
    		}
     
    		 try 
            {
                $connexionSpe = parent::__construct('mysql:dbname='.$baseSpecifique['nomBd'].';host='.$baseSpecifique['nomServeur'].';', $baseSpecifique['login'], $baseSpecifique['password']);
                // pour mysql on active le cache de requête
                if($this->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql')
                    $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    				//Sauvegarde de la connexion spécifique
    				$this->saveConnexion($baseSpecifique['ID'],$baseSpecifique['idUser']);
                return $connexionSpe;
            }
            catch(PDOException $e) {
               //Afficher un message d'erreur
    		   echo "Erreur de construction de la connexion spécifique.";
            }
    	}
     
    	function saveConnexion($bd,$idUser){
    		date_default_timezone_set('Europe/Paris');
    		$date = date("Y-m-d H:i:s",time());
    		$adresseIp = $_SERVER['REMOTE_ADDR'];
    		$sql = "INSERT INTO Connexions (IdBase,IdUtilisateur,Date,AdresseIp)
    				VALUES(".$bd.",".$idUser.",".$date.",".$adresseIp.")";
    		$result = $this->executeSQL($sql);
    	}

    Je n'arrives pas à concevoir autre chose que récupérer mes login et mdp en session, ce qui est mauvais niveau sécurité. Mais je ne vois pas d'autre solution que de passer en appel mes identifiants à chaque demande de connexion à la base de données.
    Peut-être que je m'y prend mal?
    I want to break frite ~~ Chocolat....chocolat...CHOCOLAAAAAAAAAAT!!!

  10. #10
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Pourquoi les stocker en session ? Tu ne peux pas directement les envoyer en paramètre POST sur la page qui appelle cette fonction ?

  11. #11
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Le problème c'est que j'aurai besoin de me connecter à ma base de données spécifique à chaque fois que je veux faire une requête SQL.

    Je dois donc toujours garder quelque part mes identifiants afin de les appeler dans ma fonction de connexion.

    C'est ce quelque part que je ne trouve pas. Les seules informations en dur dans le code php sont les identifiants de connexion à ma BD "routeur".

    Mais peut être que pour ce genre d'information, un cookie est préférable?

    En tout cas, cela fonctionne avec passage par session des identifiants

    Edit: Schéma de mon fonctionnement
    Images attachées Images attachées  
    I want to break frite ~~ Chocolat....chocolat...CHOCOLAAAAAAAAAAT!!!

  12. #12
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Jolie schéma

    Alors si j'ai bien compris les identifiants de connexion aux bases "Mag" sont enregistrer dans la base "BD Routeur".
    Dans ce cas tu n'as besoin que du nom de la bd "Mag" et tu fait une requête pour récupérer les identifiant de connexion à la base au début d'un traitement.

    A la limite si tu as peur pour la sécurité je te conseil d'assigné un loggin "aléatoire" pour chaque base "Mag" et lors de la connexion de l'utilisateur tu stock uniquement ce loggin (par exemple AF86-c5GT) et lorsqu'il faut réaliser une requête tu récupère les identifiant de connexion pour la base de données alors le loggin (AF86-c5GT).

    Mais comme je l'ai déjà dit je ne suis pas un pro de la sécurité non plus ...

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

Discussions similaires

  1. [Conception] Utilisation de plusieurs bases de données ?
    Par cyreel dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/01/2007, 10h47
  2. [Conception] connexion entre 2 bases de données dans 2 noms de domaines
    Par kagura dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/03/2006, 12h53
  3. connexion a plusieurs bases de données oracle
    Par tarik75 dans le forum JDBC
    Réponses: 1
    Dernier message: 06/07/2005, 13h33
  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