Авторизация - это предоставление определённому лицу или группе лиц прав на выполнение определённых действий; а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий.
Ситуация, в которой термины используются неправильно, довольно распространена. Авторизация относится к списку таких терминов. Обычно ей называют аутентификацию. Об этом всегда стоит помнить, но мир (как минимум русскоязычный) уже не изменить.
Рассмотрим простой пример с использованием авторизации, удаление поста.
app.delete('/posts/:id', (req, res, next) => {
if (res.locals.currentUser.isGuest()) {
const error = new AccessDeniedError();
return next(error);
}
state.posts = state.posts.filter(post =>
!(post.id.toString() === req.params.id));
res.redirect('/posts');
});
Удалить пост может только залогиненный пользователь. Все остальные (гости) должны
получить в ответ 403 forbidden
, код, который означает, что произошел отказ в доступе.
В более сложных случаях нужно проверять, что пост может удалить только его автор.
Любой сайт, сложнее чем сайт-визитка, содержит в себе множество проверок на допустимость
тех или иных действий, что может привести к очень большому дублированию проверок
по всем обработчикам. Разберём, как этого можно избежать.
Route Middlewares
// a middleware sub-stack shows request info for any
// type of HTTP request to the /user/:id path
router.use('/user/:id', (req, res, next) => {
console.log('Request URL:', req.originalUrl);
next();
}, (req, res, next) => {
console.log('Request Type:', req.method);
next();
});
Express позволяет указывать любое количество мидлвар для одного и того же маршрута.
Для этого можно передать любое количество аргументов (являющихся мидлварами) в функцию use
.
Этим фактом мы и воспользуемся.
const requiredAuth = (req, res, next) => {
if (res.locals.currentUser.isGuest()) {
return next(new AccessDeniedError());
}
next();
};
app.delete('/posts/:id', requiredAuth, (req, res) => {
state.posts = state.posts.filter(post =>
!(post.id.toString() === req.params.id));
res.redirect('/posts');
});
В примере выше определена мидлвара requiredAuth
, которую можно подключать к любому
маршруту. Она проверяет, залогинен ли пользователь или нет, если нет, то дальше по
цепочке передаётся ошибка. Как мы уже знаем, это приводит к тому, что начинают выполняться
только мидлвары, обрабатывающие ошибки. Этот механизм полезен не только для контроля доступа,
таким образом можно выполнять любые подготовительные действия, которые используются
разными маршрутами.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты