Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 07/12/2011, 10h50   #1
Membre actif
 
Avatar de Emyleen
 
Femme Emeline Dabée
Webmaster
Inscription : mars 2010
Messages : 136
Détails du profil
Informations personnelles :
Nom : Femme Emeline Dabée
Âge : 26
Localisation : France, Aveyron (Midi Pyrénées)

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

Informations forums :
Inscription : mars 2010
Messages : 136
Points : 171
Points : 171
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!
Emyleen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 14h09   #2
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
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 ...
humitake est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 14h24   #3
Membre actif
 
Avatar de Emyleen
 
Femme Emeline Dabée
Webmaster
Inscription : mars 2010
Messages : 136
Détails du profil
Informations personnelles :
Nom : Femme Emeline Dabée
Âge : 26
Localisation : France, Aveyron (Midi Pyrénées)

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

Informations forums :
Inscription : mars 2010
Messages : 136
Points : 171
Points : 171
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?
Emyleen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 14h36   #4
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
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.
humitake est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 15h04   #5
Membre actif
 
Avatar de Emyleen
 
Femme Emeline Dabée
Webmaster
Inscription : mars 2010
Messages : 136
Détails du profil
Informations personnelles :
Nom : Femme Emeline Dabée
Âge : 26
Localisation : France, Aveyron (Midi Pyrénées)

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

Informations forums :
Inscription : mars 2010
Messages : 136
Points : 171
Points : 171
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
Emyleen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 15h12   #6
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
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.
humitake est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 15h41   #7
Membre actif
 
Avatar de Emyleen
 
Femme Emeline Dabée
Webmaster
Inscription : mars 2010
Messages : 136
Détails du profil
Informations personnelles :
Nom : Femme Emeline Dabée
Âge : 26
Localisation : France, Aveyron (Midi Pyrénées)

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

Informations forums :
Inscription : mars 2010
Messages : 136
Points : 171
Points : 171
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) ^^
Emyleen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 16h28   #8
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
Alors j’attends ton retour
humitake est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2011, 11h41   #9
Membre actif
 
Avatar de Emyleen
 
Femme Emeline Dabée
Webmaster
Inscription : mars 2010
Messages : 136
Détails du profil
Informations personnelles :
Nom : Femme Emeline Dabée
Âge : 26
Localisation : France, Aveyron (Midi Pyrénées)

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

Informations forums :
Inscription : mars 2010
Messages : 136
Points : 171
Points : 171
Bonjour,

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

Code php :
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?
Emyleen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 14h28   #10
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
Pourquoi les stocker en session ? Tu ne peux pas directement les envoyer en paramètre POST sur la page qui appelle cette fonction ?
humitake est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2011, 15h01   #11
Membre actif
 
Avatar de Emyleen
 
Femme Emeline Dabée
Webmaster
Inscription : mars 2010
Messages : 136
Détails du profil
Informations personnelles :
Nom : Femme Emeline Dabée
Âge : 26
Localisation : France, Aveyron (Midi Pyrénées)

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

Informations forums :
Inscription : mars 2010
Messages : 136
Points : 171
Points : 171
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
Type de fichier : jpg fonctionnement-requete.jpg (30,3 Ko, 5 affichages)
Emyleen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 15h44   #12
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
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 ...
humitake 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 22h10.


 
 
 
 
Partenaires

Hébergement Web