0.Концепция
Маркер JWT (https://jwt.io/), содержит payload
, в этой полезной нагрузке вы можете указать пользовательский объект role
. В объекте роли вы можете установить логические значения для определенияесли роль - ученик, родитель или администратор.
Пример полезной нагрузки
{
...
"role": {
student: true,
parent: false,
admin: false,
}
}
Когда вы собираетесь сгенерировать токен для конкретного пользователя, прикрепите данные полезной нагрузки ктокен. (Конечно, вы можете настроить данные полезной нагрузки в зависимости от того, хотите ли вы, чтобы пользователь был учеником, родителем или администратором).
Каждый раз, когда пользователь делает запрос в будущем, используя свой токен, вы можете сделатьобратный вызов для проверки своего токена и просмотра объекта payload.role
, чтобы узнать, какую роль играет пользователь, а затем принять решение о том, уполномочены ли они выполнять определенное действие или нет.
1Генерация токена
См. https://www.npmjs.com/package/jsonwebtoken для получения дополнительной информации о генерации токена.
const payload = {
userid: 123,
role: {
student: false,
parent: false,
admin: true,
},
};
const signOptions = {
issuer: this.config.jwt.issuer,
subject: payload.userid,
audience: this.config.jwt.audience,
expiresIn: "730d",
algorithm: "RS256",
};
const token = jwt.sign(payload, this.config.jwt.privateKey.replace(/\\n/g, "\n"), signOptions);
2. Промежуточное ПО для проверки роли
Вы должны ужечто-то вроде этого, если вы используете паспорт с аутентификацией JWT.
const authGuard = PassportMiddleware.authenticate("jwt", { session: false });
router.get("/admin", authGuard, controller.index);
Нам нужно новое промежуточное программное обеспечение для обработки проверки ролей.Мы назовем это промежуточное ПО adminGuard
.После аутентификации с использованием промежуточного программного обеспечения authGuard
объект req
будет содержать пользователя (который является полезной нагрузкой jwt).Теперь, когда у нас есть информация о пользователях, мы можем проверить, какую роль они выполняют.
const adminGuard = (req, res, next) => {
if(req.user && !req.user.role.admin) {
next(new Error('You are not an admin'));
} else {
next();
}
}
router.get("/admin", authGuard, adminGuard, controller.index);
Вы можете создать новую защиту промежуточного программного обеспечения для каждой роли.