Я создаю сайт рецензирования книг со стеком MEAN, где пользователи публикуют статьи о книгах. Пользователь может редактировать и удалять только созданные им сообщения, это означает, что моя авторизация выполнена и работает отлично.
Но сейчас я пытаюсь достичь супер пользователя. Я пытаюсь сделать супер-пользователя, который будет иметь доступ к редактированию и удалению любого сообщения независимо от того, кто его создал. Это нужно мне, чтобы я мог отслеживать, публикует ли кто-нибудь плохой контент.
Для целей Авторизация во внешнем интерфейсе я использую класс-перехватчик, который перехватывает все запросы http
, отправленные из класса service
. interceptor
приведено ниже,
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
import { AuthService } from './auth-service';
import { Injectable } from '@angular/core';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService) {}
intercept(req: HttpRequest<any>, next: HttpHandler) {
const authToken = this.authService.getToken();
const authRequest = req.clone({
headers: req.headers.set('Authorization', 'Bearer ' + authToken)
});
return next.handle(authRequest);
}
}
Проверяет токен пользователя, отправляющего запрос http
. Это проверяется в бэкэнде с другим промежуточным ПО с именем check-auth.js
. Который дан ниже,
const jwt = require("jsonwebtoken");
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(" ")[1];
const decodedToken = jwt.verify(token, "E8PbieHoNk");
req.userData = {email: decodedToken.email, userId: decodedToken.userId};
next();
} catch (error) {
res.status(401).json({
message: 'You are not authorized !'
});
}
};
Здесь указывается метод контроллера, который удаляется,
exports.deletePost = (req, res, next) => {
Post.deleteOne({ _id: req.params.id, creator: req.userData.userId }).then(result => {
console.log(req.params.id);
console.log(result);
if(result.n > 0) {
res.status(200).json({message: "Post deleted"});
} else {
res.status(401).json({message: "You Unauthorized"});
}
})
.catch(error => {
res.status(500).json({
message: "Deleting a post failed !"
});
});
}
Все работает очень хорошо.
Теперь я попытался предоставить суперпользователю доступ к удалению любого сообщения: я попытался добавить его userId
в промежуточное ПО check-auth.js
и проверить это в методе контроллера для * 1025. * будь то сам пользователь создателя поста или суперпользователь, поскольку я хочу, чтобы оба могли удалить. Но это не сработало.
Вот что я пробовал,
exports.deletePost = (req, res, next) => {
if(req.userData.userId === '5c8cd83a6efff92cf85bd6eb') {
Post.deleteOne({ _id: req.params.id, creator: req.userData.userId }).then(result => {
console.log(req.params.id);
console.log(result);
if(result.n > 0) {
res.status(200).json({message: "Post deleted"});
} else {
res.status(401).json({message: "You Unauthorized"});
}
})
.catch(error => {
res.status(500).json({
message: "Deleting a post failed !"
});
});
} else {
Post.deleteOne({ _id: req.params.id, creator: req.userData.userId }).then(result => {
console.log(req.params.id);
console.log(result);
if(result.n > 0) {
res.status(200).json({message: "Post deleted"});
} else {
res.status(401).json({message: "You Unauthorized"});
}
})
.catch(error => {
res.status(500).json({
message: "Deleting a post failed !"
});
});
}
}
Здесь идентификатор пользователя, который будет иметь самый высокий доступ, равен 5c8cd83a6efff92cf85bd6eb
. Я думал, когда он войдет в метод удаления, получит id
из jsonwebtoken
из промежуточного программного обеспечения check-auth
и позволит ему удалить. Это то, что я пытался.
Некоторые подсказки к этой проблеме о лучшей практике означают большую помощь. Я предоставил все возможные детали выше.
Спасибо за время и усилия.