Category Archives

5 Articles
Authentification sous MongoDB

Authentification sous MongoDB

Aujourd’hui, changement complet de technologie. Depuis quelques semaines au travail, nous migrons notre projet PHP/MySQL/JS vers du NodeJS/MongoDB avec une API REST. Je vais donc partager avec vous un point avec lequel j’ai eu un peu de mal : L’authentification avec MongoDB.

Je tiens à préciser que cet article ne remplace pas la documentation officielle et qu’ici, il ne s’agit que d’une mise en application à travers ce que j’ai compris. Si j’ai fait une erreur, merci de me le préciser en commentaires.

Précisions

Je ne m’attarderai pas sur qu’est-ce que MongoDB et quelles sont les différences avec une base de donnée relationnelle. Si vous voulez savoir ceci, je vous renvoie pour le moment vers cet article donnant la plupart des différences avec MySQL, CouchDB et MongoDB.

Mise en place

Si vous avez mongoDB installé sur votre serveur, vous savez aussi que vous avez, à l’instar de MySQL, un client disponible en ligne de commande, à savoir pour MongoDB : mongo. C’est avec cet outil que nous allons créer notre utilisateur.

Ensuite, il faut savoir que pour l’authentification, et ce peu importe la base de donnée cible, MongoDB s’appuie sur la liste des utilisateurs présents dans la base admin. Nous allons donc créer notre utilisateur simplement en faisant ceci :

use admin
db.addUser("nomduuser", "password")

Normalement, après avoir rentré ceci, mongo devrait vous retourner ce résultat :

{
    "user" : "test",
    "readOnly" : false,
    "pwd" : "a6de521abefc2fed4f5876855a3484f5",
    "_id" : ObjectId("517c027488495859945639e6")
} 

Votre user a été correctement créé. Au cas où, nous allons le vérifier grâce à la commande db.system.users.find() et elle devrait vous retourner la même chose que plus haut.

Bien, votre utilisateur a été créé mais vous pouvez vous connecter à votre serveur sans vous authentifier et effectuer toutes les actions que vous voulez. C’est normal car de base, MongoDB a désactivé la couche d’authentification.

Pour activer l’authentification, nous devrons modifier la configuration de mongoDB à partir du fichier mongod.conf en rajoutant simplement cette ligne :

auth = true

Ensuite, relancez simplement le processus mongod.

Pour tester l’authentification, vous avez plusieurs choix. Soit en lançant mongo, soit avec la commande mongo db.auth("login","password"), soit via votre application connectée au serveur ou soit via un logiciel d’administration pour MongoDB.

Personnellement, je les test grâce à l’application GenghisApp mais nous allons voir le cas avec la commande db.auth(). Relancez donc le client mongo et essayez d’ajouter un nouvel utilisateur. Vous devriez normalement avoir l’erreur suivante :

Sat Apr 27 19:09:58.263 JavaScript execution failed: error: 
{ "$err" : "not authorized for query on admin.system.users", "code" : 16550 } 
at src/mongo/shell/query.js:L128

C’est bon, le système d’authentification est en marche. Pour palier à ceci, faites juste la commande suivante :

db.auth("votrelogin","votremotdepasse")

Et mongoDB devrait vous laisser passer en retournant simplement 1. Si vous essayez de vous authentifier avec un login/password invalide, vous devriez avoir l’erreur suivante :

Error: 18 { ok: 0.0, errmsg: "auth fails" }
Lors des tests sur mon poste, la commande mongo me retournait une erreur d’authentification alors que GenghisApp arrivait bien à se connecter avec mon utilisateur. Apres plusieurs redémarrages de MongoDB, l’authentification s’est mise à marcher avec mongo.

Voilà, votre base MongoDB utilise maintenant l’authentification. Vous pouvez aller plus loin avec les différents droits existants au seins de MongoDB à l’instar de MySQL. Mais pour ça, je vous renvoie vers la Documentation officielle

Edition du 13 Mai :

Il semblerait qu’en plus de la base admin, si vous voulez accéder directement à votre application, vous devrez créer ce même utilisateur dans la base cible.

Oracle XE: verdict

Après différents tests de la version express d’Oracle, nous nous sommes aperçut qu’une fonction utile mais vraiment bête a été désactivée dans l’assistant de création de base. Il s’agit de la définition d’une valeur par défaut. Bon, on pouvait la définir en créant notre table directement grâce à une requête SQL mais où est l’intérêt dans ce cas ?

Au final nous avons décidés de nous tourner vers une Oracle 10g Enterprise Edition et là encore, j’ai eu quelques problèmes pour l’installation sur une distribution Linux x64 (malgré l’installation x86_64). Comme quoi, Oracle, c’est tellement en béton qu’il faut sûrement être chercheur à la NASA pour pouvoir l’installer.

A l’heure où je vous parle, j’ai enfin réussit à lancer l’installation et j’en ai pour quelques heures avant la fin (si j’y arrive bien).

Un conseil. Si vous devez utiliser Oracle, prenez une distribution RedHat 4 en 32 bits sinon vous aurez des problèmes.

Oracle version gratuite

Pendant longtemps, j’ai cru qu’Oracle était réservé aux professionnels vu le coût de la licence en fonction du nombre de processeur, de clients sur la base, … Enfin bref, un truc performant pour un prix exorbitant. Et bien je me suis trompé.

Aujourd’hui, il m’a été demandé de monter un serveur oracle sur le réseau de l’entreprise pour un site en développement. J’ai alors demandé où le récupérer et s’ils avaient une licence, et, j’appris qu’une version « express » existe.

Elle est gratuite, s’administre par une interface web (comme VMware server 2) et a certaines limitations dont :

  • Limitation à un processeur (ne me demandez pas, j’ai jamais compris cette histoire)
  • Limitation à 4Go de stockage des bases de données
  • Limitation à 1Go de ram d’utilisation
  • Version 10g utilisée ici (contre la 11g sur la version pro)

Enfin bon, passé ces limitations, on peut quand même s’en servir assez aisément (avant d’atteindre les 4Go pour du développement il y a le temps).

Je n’ai pas encore eu le temps de l’essayer (oublié les cours d’oracle chez moi) mais l’interface web semble être intuitive. Elle est assez sobre et je pense pouvoir rapidement m’y faire.

Je pense vous faire parvenir d’ici quelques semaines mes premières impressions sur cette version express.

Pour plus de renseignement, allez sur le site de l’éditeur. Et, pour finir, voici le screen de l’écran principal de gestion 🙂

Introduction aux ETL

Introduction aux ETL

Dans ce sujet, je vais vous faire une introduction des ETL, leur fonctionnement global et leur utilité. Tout d’abord, ETL veut dire « Extracting, Transformation Loading ».

Cette technologie est surtout utilisée pour la création et l’alimentation de bases de données décisionnelles. En effet, pour concevoir une telle base de données, nous devons récupérer des données de différentes sources (bases SQL Serveur, Oracle, fichiers CSV, fichiers Excel, fichiers texte, …) se trouvant sur différents lieux (succursale commercial, direction, ..). Tout faire à la main se révèlerait très contraignant et très long, surtout s’il s’ait de plusieurs milliers de fichiers contenants chacun des milliards de lignes.

L’ETL va nous permettre d’automatiser tout ceci. Par contre, il en existe de nombreux en fonction de votre base de donnée, si vous en avez développé un, … Personnellement, ayant réalisé une maquette de base décisionnelle sous SQL Server 2005, j’ai donc testé l’ETL de Microsoft, il s’agit de SSIS et il faut avouer qu’avec les extensions Visual studio, son utilisation se révèle extrêmement simplifiée.

En quelques clics on peut définir nos sources de données, l’ordre d’exécution, quelles étapes on effectue en cas de succès ou d’échec. Vraiment un bon ETL.

Revenons donc à nos moutons. L’ETL va donc récupérer les données que vous voulez, les convertir au format souhaité (pour les rendre conforme à votre base) et les insérer dans la table. Vous pouvez ajouter des étapes supplémentaires comme la suppression des doublons, le regroupement de différentes sources pour les injecter dans une seule base cible, sélectionner seulement certains champs, … En bref, vous pouvez quasiment tout faire.

Pour vous illustrer un peu mieux, voici un petit schéma tout con permettant de bien comprendre que l’ETL peut récupérer de n’importe quelle source (ou presque) les données que vous voulez pour les envoyer vers votre base cible.

Enfin, j’espère que cette petite mise en bouche vous aura donné envie de tester ces petits ETL. Il en existe plus d’une dizaine pour MySQL mais chacun est spécialisé pour un certain nombre de données donc essayez de bien vous renseigner. Sinon avec SQL Server (sauf version express) vous avez automatiquement l’ETL SSIS de disponible.

Je vais peut être vous faire un exemple d’utilisation dans les semaines à venir. L’importation de données à partir d’un fichier texte et Excel sur une base de données.

Sensibilation sur les Index

Dans l’article du jour, j’aimerai vous parler des Index dans une base de données.

Comme leur nom l’indique, les index permettent d’indexer des colonnes d’une table. Mais quelle colonne à indexer et pourquoi ? Et bien c’est là la question. Si sur votre application vous avez plusieurs fois des requêtes qui ressortent avec une clause ‘WHERE’ ou ‘INNER JOIN’ faisant référence au même champ, plusieurs fois, il est conseillé de l’indexer.

Pourquoi ? Et bien tout simplement pour une raison d’optimisation. Votre base de données va stoker en mémoire des tables d’index contenant tous ces index. Au lieu d’aller gratter sur le disque-dur du serveur et ainsi le mettre à genoux si on se retrouve avec 1000 clients au même moment, la base de données va regarder en mémoire la table d’index et ressortir votre résultat directement.

Attention tout de même, d’une part, vos select seront optimisés (après les premières requêtes) mais en contrepartie, les enregistrements seront beaucoup plus long car au lieu d’inscrire votre enregistrement sur une table, il sera inscrit sur votre table ciblée mais aussi sur les différentes tables index. Donc réfléchissez bien à cela.

L’astuce consiste à droper les index de la table avant l’enregistrement et à les rajouter après. Ca ne modifiera rien du côté de votre table. Mais vous gagnerez quelques secondes voir quelques heures, selon le nombre d’index que contient votre table, lors de l’enregistrement.

Attention aussi, les clés étrangères ne sont pas indexées, donc cherchez-les bien et indexez-les. C’est l’une des premières causes de ralentissement d’un serveur de bases de données.

Tout ceci je l’ai appris en cours durant la semaine et j’avais envi de vous sensibiliser sur les indexes. C’est l’une des premières causes de ralentissement d’une base de données car la plupart des personnes oublient leur utilité.