Узел JS и Контроль доступа - PullRequest
0 голосов
/ 29 апреля 2018

В моем проекте я использую RBAC Access Control . Я создал каталог контроля доступа с index.js внутри, где я создаю "grantsObject"

'use strict'

const AccessControl = require('accesscontrol');

let grantsObject = {
    admin: {
        // Extends user and can delete and update any video or post

        video: {
            'create:any': ['*'],
            'read:any': ['*'],
            'update:any': ['*'], // Admin privilege
            'delete:any': ['*']  // Admin privilege
        },
        post: {
            'create:any': ['*'],
            'read:any': ['*'],
            'update:any': ['*'], // Admin privilege
            'delete:any': ['*']  // Admin privilege
        }

    },
    user: {
        video: {
            'create:any': ['*'],
            'read:any': ['*']
        },
        post: {
            'create:any': ['*'],
            'read:any': ['*']
        }
    }
};

const ac = new AccessControl(grantsObject);

module.exports = ac;

А позже в пути мне понадобится этот объект

var ac = require('../config/access-control');

Чтобы проверить привилегии:

const permission = ac.can(req.user.userRole).readAny('post');
if (!permission.granted) {
    return res.status(403).end();
}

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

Администратор имеет вид наследования и просто расширяет привилегии пользователя. Есть ли способ избежать копирования пользовательских привилегий внутри объекта admin?

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете сначала объявить пользовательские разрешения, а затем объявить права администратора, которые расширяют пользовательские разрешения. например,

// Node.js v9.4.0
const user = {
    video: {
        'create:any': ['*'],
        'read:any': ['*']
    },
    post: {
        'create:any': ['*'],
        'read:any': ['*']
    }
}

const admin = {
    video: {
        ...user.video,
        'update:any': ['*'],
        'delete:any': ['*']
        }
    ,
    post: {
        ...user.post,
        'update:any': ['*'],
        'delete:any': ['*']
    }
}

const grantsObject = {
    admin,
    user,
};

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

...