Как создать суперпользователя с максимальным доступом в приложении стека MEAN? - PullRequest
0 голосов
/ 28 марта 2019

Я создаю сайт рецензирования книг со стеком 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 и позволит ему удалить. Это то, что я пытался.

Некоторые подсказки к этой проблеме о лучшей практике означают большую помощь. Я предоставил все возможные детали выше.

Спасибо за время и усилия.

...