Mongo:仅在插入不创建时创建哈希密码

时间:2015-05-19 21:47:04

标签: node.js mongoose

以下是我的mongo帐户集合的JS for Account mongoose模型文件,其中包含几种方法。创建帐户时,会创建hashedPassword字段,但在更新文档时它的工作方式不起作用。是仅仅在插入时调用虚拟而不是更新?

  'use strict';

  var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    crypto = require('crypto');

  var AccountSchema = new Schema({
    email: {type: String,unique: true,required: true},
    username: {type: String,unique: true,required: true},
    group:{type:Schema.Types.ObjectId,ref:"Groups",require:false},
    hashedPassword: String,
    salt: String,
    name:  {type: String,require:false},
    active:  {type: Boolean,require:false},
  });


  /**
   * Virtuals
   */
  AccountSchema.virtual('password').set(function(password) {
      this._password = password;
      this.salt = this.makeSalt();
      this.hashedPassword = this.encryptPassword(password);
    })
    .get(function() {
      return this._password;
    });

  AccountSchema.virtual('user_info').get(function () {
      return { '_id': this._id, 'username': this.username, 'email': this.email };
    });

  /**
   * Validations
   */

  AccountSchema.path('email').validate(function (email) {
    var emailRegex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
    return emailRegex.test(email);
  }, 'The specified email is invalid.');

  AccountSchema.path('email').validate(function(value, respond) {

      respond(true);

  }, 'The specified email address is already in use.');


  AccountSchema.methods = {
    authenticate: function(plainText) {
       return this.encryptPassword(plainText) === this.hashedPassword;
    },

    makeSalt: function() {
      return crypto.randomBytes(16).toString('base64');
    },

    encryptPassword: function(password) {
      console.log('encryptPassword')

      if (!password || !this.salt) return '';

      var salt = new Buffer(this.salt, 'base64');
      return crypto.pbkdf2Sync(password, salt, 10000, 64).toString('base64');
    }
  };


  mongoose.model('Account', AccountSchema);

在控制器中

$scope.register = function(form) {

  Auth.createUser({
      provider : "local",
      _id: $scope.userData._id,
      email: $scope.userData.email,
      username: $scope.userData.name,
      level : $scope.userData.level,
      group : $scope.userData.group,
      name : $scope.userData.name,
      password: $scope.userData.password,
      active: $scope.userData.active
    },

    function(err) {
      $scope.errors = {};


      if (!err) {
         $state.go('users');

      } else {

        angular.forEach(err.errors, function(error, field) {
          form[field].$setValidity('mongoose', false);
          $scope.errors[field] = error.type;
        });
      }
    }
  );

调用createUser func的services.js

/* Services */

 app.factory('User', function ($resource) {
  return $resource('/auth/users/:id/', {},
    {
        'update': {
        method:'PUT'
    }
  });
 });
 app.factory('Session', function ($resource) {

   return $resource('/auth/session/');
 });

 app.factory('Auth', function Auth($location, $rootScope, Session, User, $cookieStore) {

  $rootScope.currentUser = $cookieStore.get('user') || null;
  $cookieStore.remove('user');

  return {


    createUser: function(userinfo, callback) {

      var cb = callback || angular.noop;
      User.save(userinfo,
        function(user) {
          $rootScope.currentUser = user;
          return cb();
        },
        function(err) {

          return cb(err.data);
        });
    },

    currentUser: function() {
      Session.get(function(user) {
        $rootScope.currentUser = user;
      });
    }

  };

});

0 个答案:

没有答案