Как реализовать аутентификацию на основе ролей с помощью nodejs? - PullRequest
0 голосов
/ 23 сентября 2019

В основном я хочу, чтобы nodeJS проверял, является ли пользователь, вошедший в систему через страницу входа, администратором, или нет, если он есть, должен отправить ему страницу администратора, если он не является, он должен отправить ему другую страницу.

У меня есть одна страница входа, которая на данный момент статична, и у меня есть две HTML-страницы, каждая из которых имеет массу контроллеров jquery, поэтому, когда я подумал о переписывании всего этого в поле зрения или реакции, я понял, что это займет у меняогромное количество времени, чтобы закончить его, я перепробовал много решений, но либо я заставляю работать только часть аутентификации, а не авторизацию, или наоборот.

У меня есть простая форма входа, чего я хочу достичь, так эточто-то вроде получения данных формы и отправки их с сообщением ajax, а затем контроллер сначала проверяет подлинность пользователя, а затем проверяет, какую роль он играет, если он admin, он должен sendfile('index.html'), если он fm, он должен sendfile('req.html') Я уже написал каждую страницу, чтобы иметь возможность выполнять определенные функции, и каждая из них общается сполдюжины различных API, так что мне не понадобятся новые определения ролей и привилегий, по крайней мере, сейчас

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Ну, все, что я сделал, это ввел роль в мою пользовательскую схему, которая работает от 1 до 4, и я установил значение по умолчанию 4, которое представляет обычного пользователя, и 1-3 для другого уровня администратора, вот код, это может помочь кому-токогда-нибудь

Схема пользователя:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Create Schema
const UserSchema = new Schema({
  email: {
    type: String,
    required: true
  },

  password: {
    type: String,
    required: true
  },
  role:{
    type: Number,
    default : 4,
  },

  date: {
    type: Date,
    default: Date.now
  },
});

module.exports = User = mongoose.model('users', UserSchema);

А вот и маршрут регистрации пользователя

// @route   POST api/users/register
// @desc    Register user
// @access  Public
router.post('/register', (req, res) => {
  const { errors, isValid } = validateRegisterInput(req.body);

  // Check Validation 
  if (!isValid) {
    return res.status(400).json(errors);
  }

  User.find().sort({unitNo : -1}).then(user => {
        const newUser = new User(
      {
        email: req.body.email,
        password: req.body.password,
        });
     bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(newUser.password, salt, (err, hash) => {
          if (err) throw err;
          newUser.password = hash;

            newUser 
             .save()
              .then(user => res.json(user))
              .catch(err => console.log(err));
        });
      });

  });
});

вот логин пользователя

// @route   GET api/users/login
// @desc    Login User / Returning JWT Token
// @access  Public
router.post('/login', (req, res) => {
  const { errors, isValid } = validateLoginInput(req.body);

  // Check Validation
  if (!isValid) {
    return res.status(400).json(errors);
  }

  const email = req.body.email;
  const password = req.body.password;

  // Find user by email
  User.findOne({ email }).then(user => {
    // Check Password
    bcrypt.compare(password, user.password).then(isMatch => {
      if (isMatch) {
        // User Matched
        const payload = { id: user.id, name: user.name  }; // Create JWT Payload

        // Sign Token
        jwt.sign(
          payload,
          keys.secretOrKey,
          { expiresIn: 20000600 },
          (err, token) => {
            res.json({
              success: true,
              token: 'Bearer ' + token
            });
          }
        );
      } else {
        errors.password = 'Password incorrect';
        return res.status(400).json(errors);
      }
    });
  });
});

но для администратора, что там роли варьируются от 1 до 3, вот как выглядит логин

// @route   Post api/admins/login
// @desc    Login User / Returning JWT Token
// @access  Public
router.post('/login', (req, res) => {
  const { errors, isValid } = validateLoginInput(req.body);

  // Check Validation
  if (!isValid) {
    return res.status(400).json(errors);
  }

  const email = req.body.email;
  const password = req.body.password;

  // Find user by email
  User.findOne({ email }).then(user => {
    // Check for Admin
    if (!user) {
      errors.email = 'User not found';
      return res.status(404).json(errors);
    }
    // Check to see if level meet admin role(Her is where i check if it is the admin or the user)
    if(user.role == 4){
      errors.role = 'You are not allowed to view this page'
      return res.status(404).json(errors);
    }

    // Check Password
    bcrypt.compare(password, user.password).then(isMatch => {
      if (isMatch) {
        // User Matched
        const payload = { id: user.id, name: user.name }; // Create JWT Payload

        // Sign Token
        jwt.sign(
          payload,
          keys.secretOrKey,
          { expiresIn: "7h" },
          (err, token) => {
            res.json({
              success: true,
              token: 'Bearer ' + token
            });
          }
        );
      } else {
        errors.password = 'Password incorrect';
        return res.status(400).json(errors);
      }
    });
  });
});

Надеюсь, это когда-нибудь решит вопрос кого-то ...

1 голос
/ 25 сентября 2019

хорошо, поскольку никто не удосужился ответить, я написал статью на носителе для начинающих, заинтересованных в изучении аутентификации на основе сеансов и не желающих быть перегруженными тысячами фреймворков и библиотек.https://medium.com/@ahmedcheikhsidahmed/authentication-with-nodejs-expressjs-the-simple-way-945939878e16

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