Как сделать промежуточное ПО на основе ролей для доступа к API с соответствующими правами в nodejs и mongoose? - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь создать веб-сайты с разрешением ролей. Это будет выглядеть как

SuperAdmin - will approve admins and will have all right which admin have

Admin - will approve articles and will have all the rights which loggedin user have

Loggedin User - can post articles and will have all the rights which guest user have.

Guest(Non Loggedin User) - can see articles.

. У меня есть идея создать схему с role key, я делаю все API, но не знаю, какдать разрешение на то, чтобы конкретный apis был доступен тому, кто имеет на это право.

Может кто-нибудь помочь мне в создании этого промежуточного программного обеспечения для аутентификации?

Спасибо заранее.

1 Ответ

0 голосов
/ 15 декабря 2018

Итак, прежде всего, вы должны иметь роль пользователя в вашем req объекте.Я полагаю, вы сделали это.Затем вы можете указать псевдонимы для ваших ролей в базе данных.Например,

SuperAdmin - superadmin

Admin - admin

Loggedin User - user

Guest(Non Loggedin User) - you do not need to have a role for a guest, you just can check whether user authenticated or not

Пример промежуточного программного обеспечения будет выглядеть как

// Authentication middleware
const isAuthenticated = (roles) => (req, res, next) => {
  // `roles` argument is an array of roles
  // We check whether user authenticated or not.
  // If user authenticated, `req.user` will be object otherwise it will be `undefined` 
  if(req.user) { // `req.user` is a user object from Database
    // Checking whether `req.user` has a corresponded role
    if (roles.indexOf(req.user.role) !== -1) next(); // `req.user.role` is string and it may be "admin", "superadmin", or "user"
    else res.status(403).send({message: "unauthorized"}); 
  } else {
    res.status(401).send({message: "unauthorized"});
  }
};

. И вы можете использовать это промежуточное ПО на маршрутизаторе

const express = require('express');
const router = express.Router();

// Example routes

// This route is for guests
router.get('/articles', (req, res) => {
  res.send({'article': 'lorem ipsum'})
});

// This route is for authenticated user
router.get('/forOnlyAuthUser', isAuthenticated(['user']) (req, res) => {
  res.send({user: req.user})
});

// This route is for admin
router.get('/forOnlyAdmin', isAuthenticated(['admin']) (req, res) => {
  res.send({user: req.user})
});

// This route is for superadmin
router.get('/forOnlySuperadmin', isAuthenticated(['superadmin']) (req, res) => {
  res.send({user: req.user})
});

// This route is for all authenticated users
router.get('/forOnlyAllAuthUsers', isAuthenticated(['user', 'admin', 'superadmin']) (req, res) => {
  res.send({user: req.user})
});

Вы можете настроить функцию isAuthenticatedкак хочешь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...