Проектирование моделей и авторизация ролей в express с использованием mongoDB - PullRequest
0 голосов
/ 11 июля 2020

В моем приложении у меня есть пользователи и документы, которые находятся во взаимосвязи «многие ко многим» (каждый документ будет иметь сотни пользователей, а каждый пользователь несколько, может быть, до двадцати документов). Кроме того, в каждом документе есть определенные пользователем c данные. А у пользователей разные роли в документах, которые нужно аутентифицировать в маршрутах и ​​в шаблоне .e js. Я не уверен, что мне нужна отдельная модель пользовательского документа? Или сохранить данные пользовательского документа внутри пользователя в виде массива объектов? А где хранить пользовательские роли и как получить к ним доступ? Что было бы лучше всего для этого? Я использую mon goose и mongoDB, паспорт для аутентификации.

модели / пользователь. js

const mongoose = require("mongoose");
const passportLocaleMongoose = require("passport-local-mongoose");

const userSchema = new mongoose.Schema({
    username: String,
    password: String
});

userSchema.plugin(passportLocaleMongoose);

module.exports = mongoose.model("User", userSchema);

модели / документ. js

const mongoose = require("mongoose");

const documentSchema = new mongoose.Schema({
    name: {type:String, required: true},
    url: {type: String, required: true, unique: true},
    description: String,
    someData: String
});

module.exports = mongoose.model("Document", documentSchema);

маршруты / документы. js

router.put("/:id", middleware.checkDocumentAuthorization, function(req, res) {
    let editedDocument = req.body.document;
    Document.findOneAndUpdate({id: req.params.id}, editedDocument, {new: true}, function(err, updatedDocument) {
        if(err) {
            console.log(err);
        } else {
            res.redirect("/c/" + updatedDocument.id);
        }
    });
});

промежуточное ПО / аутентификация js

const Document = require("../models/document");
const User = require("../models/user");
let middlewareObj = {};
                
middlewareObj.checkDocumentAuthorization = function (req, res, next) {
    req.session.returnTo = req.originalUrl;
    if(req.isAuthenticated()) {
        Document.findOne({id: req.params.id}, function(err, foundDocument) {
        if(err) {
            console.log(err);
                res.redirect("back");
            } else {
                //used to check just for author of document, but now I have different roles for different documents
                if(foundDocument.author.id.equals(req.user._id)) {
                    next();
                } else {
                    req.flash("error", "You are not authorized to do that");
                    res.redirect("back");
                }
            }
        });
    } else {
      req.flash("error", "Please, log in first");
      res.redirect("/login");
    }
}
            
module.exports = middlewareObj;
...