MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Các vai trò và quyền của người dùng Express.js / Mongoose

Tôi đã tìm thấy một giải pháp. Thật tuyệt khi nghe ý kiến ​​của mọi người về điều này.

Tôi có một đối tượng cấu hình quyền xác định từng vai trò và các quyền của chúng.

Đối tượng cấu hình quyền

roles.admin = {
    id: "admin",
    name: "Admin",
    description: "",
    resource : [
        {
            id : 'blog', 
            permissions: ['create', 'read', 'update', 'delete']
        },
        {
            id : 'user',
            permissions: ['create', 'read', 'update', 'delete']
        },
        {
            id : 'journal',
            permissions: ['create', 'read', 'update', 'delete']
        },

    ]
};

roles.editor = {
    id: "editor",
    name: "Editor",
    description: "",
    resource : [
        {
            id : 'blog', 
            permissions: ['create', 'read', 'update', 'delete']
        },
        {
            id : 'user',
            permissions: ['read']
        },
        {
            id : 'journal',
            permissions: ['create', 'read', 'update']
        },

    ]
};

Chức năng phần mềm trung gian

var roles = require('./config');


var permissions = (function () {

  var getRoles = function (role) {

    var rolesArr = [];

    if (typeof role === 'object' && Array.isArray(role)) {

        // Returns selected roles   
        for (var i = 0, len = role.length; i < len; i++) {
            rolesArr.push(roles[role[i]]);
        };
        return rolesArr;

    } else if (typeof role === 'string' || !role) {

        // Returns all roles
        if (!role) {
            for (var role in roles) {
                rolesArr.push(roles[role]);
            };
        }   

        // Returns single role
        rolesArr.push(roles[role]);
        return rolesArr;

    }

},
check = function (action, resource, loginRequired) {

    return function(req, res, next) {

        var isAuth = req.isAuthenticated();

        // If user is required to be logged in & isn't
        if (loginRequired  && !isAuth) {
            return next(new Error("You must be logged in to view this area"));
        }

        if (isAuth || !loginRequired) {

            var authRole = isAuth ? req.user.role : 'user', 
                role =  get(authRole),
                hasPermission = false;

            (function () {
                for (var i = 0, len = role[0].resource.length; i < len; i++){
                    if (role[0].resource[i].id === resource && role[0].resource[i].permissions.indexOf(action) !== -1) {
                        hasPermission = true;
                        return;
                    }
                };
            })();

            if (hasPermission) {
                next();
            } else {
                return next(new Error("You are trying to " + action + " a " + resource + " and do not have the correct permissions."));
            }

        }
    }
}

return {
    get : function (role) {

        var roles = getRoles(role);

        return roles;
    },
    check : function (action, resource, loginRequired) {
        return check(action, resource, loginRequired);
    }
}

})();

module.exports = permissions;

Sau đó, tôi đã tạo một chức năng phần mềm trung gian, khi kiểm tra phương thức được gọi là nó nhận vai trò của người dùng từ yêu cầu đối tượng (req.user.role). Sau đó, nó sẽ xem xét các thông số được chuyển đến phần mềm trung gian và tham chiếu chéo chúng với các thông số trong đối tượng cấu hình quyền.

Định tuyến bằng phần mềm trung gian

app.get('/journal', `**permissions.check('read', 'journal')**`, function (req, res) {
     // do stuff
};


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cập nhật mảng với push và slice

  2. Module.require (...). * Có trả về một bản sao của module.exports. * Hoặc một tham chiếu của nó không?

  3. Cách tải phiên bản mongodb từ mongoose

  4. Lỗi MongoDB CursorNotFound trên collection.find () cho một vài trăm bản ghi nhỏ

  5. Làm cách nào để lưu dữ liệu của tôi trên mongoDB bằng cách sử dụng expressjs?