2014-12-30 3 views
0

В моем средстве js app у меня есть модель учетной записи и соответствующие маршруты и контроллеры. Чтобы удалить определенную учетную запись, мне нужно иметь авторизацию, и мне нужно войти в систему.MEAN js требует авторизации для перечня элементов

Все пользователи могут, однако, перечислять все учетные записи, я имею обыкновение перечислять учетные записи, созданные определенным пользователем. Поэтому мне нужно добавить авторизацию в часть списка кода.

Я обновить маршруты для app.route('/accounts') с users.requiresLogin и accounts.hasAuthorization, как показано ниже:

module.exports = function(app) { 
    var users = require('../../app/controllers/users.server.controller'); 
    var accounts = require('../../app/controllers/accounts.server.controller'); 

    // Accounts Routes 
    app.route('/accounts') 
     .get(users.requiresLogin,accounts.hasAuthorization,accounts.list) 
     .post(users.requiresLogin, accounts.create); 

    app.route('/accounts/:accountId') 
     .get(users.requiresLogin, accounts.hasAuthorization,accounts.read) 
     .put(users.requiresLogin, accounts.hasAuthorization, accounts.update) 
     .delete(users.requiresLogin, accounts.hasAuthorization, accounts.delete); 

    // Finish by binding the Account middleware 
    app.param('accountId', accounts.accountByID); 
}; 

Теперь я получаю errror так REQ не предоставляется пользователю.

GET /modules/accounts/views/list-accounts.client.view.html 304 8.266 ms - - TypeError: Cannot read property 'user' of undefined at exports.hasAuthorization (/Users/david/Repositories/budget/app/controllers/accounts.server.controller.js:103:17)

Так что, я думаю, мне нужно как-то обновить accounts.server.controller. Учетная запись удаления предоставляет учетную запись в req, так что только создатель может удалить, как я упоминал ранее. Как мне обновить код, чтобы часть «Список учетных записей» работала и перечисляла только учетные записи, принадлежащие этому конкретному пользователю?

/** 
* Delete an Account 
*/ 
exports.delete = function(req, res) { 
    var account = req.account ; 

    account.remove(function(err) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.jsonp(account); 
     } 
    }); 
}; 

/** 
* List of Accounts 
*/ 
exports.list = function(req, res) { 
    Account.find().sort('-created').populate('user', 'displayName').exec(function(err, accounts) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.jsonp(accounts); 
     } 
    }); 
}; 

/** 
* Account middleware 
*/ 
exports.accountByID = function(req, res, next, id) { 
    Account.findById(id).populate('user', 'displayName').exec(function(err, account) { 
     if (err) return next(err); 
     if (! account) return next(new Error('Failed to load Account ' + id)); 
     req.account = account ; 
     next(); 
    }); 
}; 

/** 
* Account authorization middleware 
*/ 
exports.hasAuthorization = function(req, res, next) { 
    if (req.account.user.id !== req.user.id) { 
     return res.status(403).send('User is not authorized'); 
    } 
    next(); 
}; 

Клиент службы счета содержит только основные вещи:

//Accounts service used to communicate Accounts REST endpoints 
angular.module('accounts').factory('Accounts', ['$resource', 
    function($resource) { 
     return $resource('accounts/:accountId', { accountId: '@_id' 
     }, { 
      update: { 
       method: 'PUT' 
      } 
     }); 
    } 
]); 

И объект пользователя не упоминается в контроллере.

+0

я могу изменить список в контроллере сервера, чтобы найти только элементы с этим конкретным пользователем: Account.find ({пользователем: req.user}) является достаточно? –

ответ

1

Учетные записи.Асавторизация предполагает, что он будет выполнен после учетной записи account.accountById, в вашей текущей конфигурации req.account будет неопределенным.

Я assumming, что где-то в вашей модели счета у вас есть:

user: { 
    type: Schema.ObjectId, 
    ref: 'User' 
} 

Если вы хотите, чтобы пользователь имел доступ только к счетам, он/она владеет только:

  • Изменение счета .list маршрут только до требуется Логин, и это дает нам доступ к req.user:

    app.route('/accounts') 
         .get(users.requiresLogin,accounts.list) 
    
  • Изменение exports.list в контроллере счета:

    exports.list = function(req, res) { 
        Account.find({user: req.user._id}).sort('-created') 
    .... // 
    
    };