Comment protéger le champ mot de passe dans la Mangouste/MongoDB donc il ne sera pas de retour dans une requête lorsque je remplir collections?
Supposons que j'ai deux collections/schemas. On est les Utilisateurs de Schéma avec un nom d'utilisateur et le mot de passe de champs, alors, j'ai un Blogs Schéma qui a une référence pour les Utilisateurs de Schéma dans le champ auteur. Si j'utilise la Mangouste à faire quelque chose comme
Blogs.findOne({...}).populate("user").exec()
J'aurai le Blog de document et l'utilisateur a renseigné trop, mais comment puis-je prévenir la Mangouste/MongoDB de retourner le champ mot de passe? Le champ mot de passe est haché, mais il ne devrait pas être retourné.
Je sais que je peux omettre le champ mot de passe et revenir le reste des champs dans une requête simple, mais comment dois-je faire avec les remplir. Aussi, est-il un moyen élégant pour ce faire?
Également, dans certaines situations, j'ai besoin d'obtenir le champ mot de passe, comme lorsque l'utilisateur souhaite de connexion ou modifier le mot de passe.
- vous pouvez aussi le faire .remplir('utilisateur': 1, 'mot de passe':0)
Vous devez vous connecter pour publier un commentaire.
http://mongoosejs.com/docs/populate.html
JohnnyHKs réponse à l'aide des options de Schéma est probablement la voie à suivre ici.
Également noter que
query.exclude()
n'existe que dans le 2.x branche.Vous pouvez changer le comportement par défaut lors de la définition du schéma de niveau à l'aide de la
select
attribut du champ:Ensuite, vous pouvez tirer en tant que de besoin dans
find
etpopulate
appels via la zone de sélection comme'+password'
. Par exemple:Edit:
Après avoir essayé les deux approches, j'ai trouvé que le excluent toujours approche ne fonctionnait pas pour moi pour une raison quelconque à l'aide de passeport, de stratégie locale, ne sais vraiment pas pourquoi.
Donc, c'est ce que j'ai fini par utiliser:
Il n'y a rien de mal avec l'exclure toujours dans l'approche, il n'a tout simplement pas travailler avec passeport pour quelque raison que mes tests m'a dit qu'en fait, le mot de passe a été exclus /inclus quand je voulais. Le seul problème avec la est toujours la démarche, c'est que j'ai fondamentalement besoin pour aller de travers à chaque appel, je n'ai à la base de données et d'exclure le mot de passe qui est beaucoup de travail.
Après une paire de grandes réponses, j'ai découvert il y a deux manières de le faire, le "toujours inclure et exclure parfois" et "toujours exclure et inclure parfois"?
Un exemple à la fois:
L'est toujours, mais excluent parfois exemple:
ou
La exlucde toujours, mais comprennent parfois exemple:
mais vous devez définir dans le schéma:
.select("+field")
il n'apporte que la__id
, même si.select("-field")
exclut bien le domaine que je veuxselect: false
est obligatoireUser.find().select('-password')
est la bonne réponse. Vous ne pouvez pas ajouter deselect: false
sur le Schéma, car il ne fonctionnera pas, si vous souhaitez vous connecter.Vous pouvez le faire en utilisant le schéma, par exemple:
En supposant que le champ mot de passe est "password", vous pouvez le faire:
Il y a de plus en plus vastes exemple ici
Qui est axé sur les commentaires, mais c'est le même principe en jeu.
C'est la même chose à l'aide d'une projection dans la requête de MongoDB et en passant
{"password" : 0}
dans le champ de projection. Voir iciJ'utilise pour cacher champ de mot de passe dans mon REPOS réponse JSON
La solution est de ne jamais stocker les mots de passe en clair. Vous devez utiliser un programme comme bcrypt ou mot de passe hash.
Exemple d'utilisation de hachage du mot de passe:
Exemple d'utilisation pour vérifier le mot de passe:
Vous pouvez passer une DocumentToObjectOptions objet de schéma.la méthode toJSON() ou schéma.toObject().
Voir Tapuscrit définition de @types/mangouste
DocumentToObjectOptions a une option transformer qui exécute une fonction personnalisée après la conversion du document à l'objet javascript. Ici vous pouvez masquer ou modifier les propriétés pour combler vos besoins.
Donc, disons que vous êtes à l'aide de schémas.toObject() et que vous souhaitez masquer le mot de passe de chemin d'accès de l'Utilisateur de votre schéma. Vous devez configurer un général de transformation de la fonction qui sera exécutée après chaque toObject() de l'appel.
Blogs.findOne({ _id: id }, { "password": 0 }).populate("user").exec()
Tout en utilisant
password: { type: String, select: false }
vous devriez garder à l'esprit qu'il exclut par mot de passe lorsque nous en avons besoin pour l'authentification. Donc, être préparé pour la gérer comme vous le souhaitez.Ce n'est plus un corollaire à la question initiale, mais c'est la question que je suis tombé sur essayer de résoudre mon problème...
À savoir, comment faire pour envoyer l'utilisateur vers le client, de l'utilisateur.save() de rappel sans le champ mot de passe.
Cas d'utilisation: l'utilisateur de l'application des mises à jour leurs informations de profil/paramètres du client (mot de passe, informations de contact, whatevs). Vous souhaitez envoyer la mise à jour des informations de l'utilisateur vers le client dans la réponse, une fois qu'il a enregistré avec succès à mongoDB.
J'ai trouvé une autre manière de faire, par l'ajout de certains paramètres du schéma de configuration.
Par l'ajout de fonction de transformation de la méthode toJSON objet avec le nom de zone à exclure. comme Dans docs a déclaré: