Я пытаюсь написать очень простой компонент промежуточного программного обеспечения для Express, который проверяет, имеет ли пользователь определенную роль, необходимую для доступа к ресурсу. У меня есть еще один компонент промежуточного программного обеспечения, который предшествует этому, который добавляет объект пользователя к запросу req
для каждого маршрута, требующего аутентификации (и последующей авторизации).Не удалось зарегистрировать экспресс-промежуточное ПО
Таким образом, я определяю промежуточное авторизации, как это:
_ = require('lodash');
function authorize(req, res, next, roles){
// check to see if user has one of the allowed roles
if(_.contains(roles, req.user.role)){
req.authorized = true;
return next();
}
// otherwise, pass an error
return next(new Error("Unauthorized"));
}
Каждый объект пользователь имеет свойство role
на нем, поэтому я использую _.contains(roles, req.user.role)
, чтобы выяснить, является ли или не содержать разрешенные роли пользователя, присваиваемый роль.
Однако, когда я это делаю, я получаю TypeError: Cannot read property 'role' of undefined
, как только я запускаю свой Экспресс-сервер. Это кажется мне очень странным, потому что я даже не сделал запроса, и, конечно, req.user
будет неопределенным до тех пор.
Есть ли способ обойти это?
Пример того, как я использую это промежуточное программное обеспечение:
var app = express();
var router = express.Router();
router.get('/protected/:id', authorize(['ADMINISTRATOR', 'MANAGER', 'OWNER']), controllers.protected.retrieve);
Можете ли вы показать нам, где вы добавляете к промежуточному? Если бы я должен был предположить, что вы добавляете его как 'authorize()' вместо 'authorize'. –
@BenjaminGruenbaum У меня есть обновленный мой вопрос. Как вы думаете, мне нужно передать все параметры (т. Е. Req, res, next) в мое промежуточное ПО в маршрутизации, чтобы заставить это работать? Спасибо за вашу помощь – nmagerko
Нет, вам нужно передать _a function_ внутри, а не называть его, если это слишком абстрактно для вашего текущего JS - оберните его в (function() {return authorize (....);}) –