sql >> データベース >  >> NoSQL >> MongoDB

Express.js/Mongooseのユーザーロールと権限

    私は解決策を見つけました。これについての人々の意見を聞くのは素晴らしいことです。

    各役割とその権限を定義する権限設定オブジェクトがあります。

    権限構成オブジェクト

    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']
            },
    
        ]
    };
    

    ミドルウェア機能

    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;
    

    次に、チェック時にミドルウェア関数を作成しました メソッドが呼び出され、 reqからユーザーの役割を取得します オブジェクト(req.user.role)。次に、ミドルウェアに渡されたパラメーターを調べ、それらをパーミッション構成オブジェクト内のパラメーターと相互参照します。

    ミドルウェアでルーティング

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


    1. MongoDB \ Driver \ Exception \ InvalidArgumentExceptionプラットフォームで整数のオーバーフローが検出されました:300000000000

    2. Mongo C#ドライバー-ネストを使用して動的にフィルターを構築する

    3. Azure DocumentDBローカルエミュレーターはmongodbプロトコルをサポートしていますか?

    4. 新しいRedisマスターがSentinelを使用している場所をクライアントに伝える方法