В моем средстве 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'
}
});
}
]);
И объект пользователя не упоминается в контроллере.
я могу изменить список в контроллере сервера, чтобы найти только элементы с этим конкретным пользователем: Account.find ({пользователем: req.user}) является достаточно? –