2016-08-24 3 views
0

В настоящее время я пытаюсь реализовать модуль ACL Node, найденный здесь: https://www.npmjs.com/package/acl в приложении Mean.JS (v0.4.2).Mongodb Backend для узла ACL всегда возвращается False

По умолчанию Mean.JS использует «memoryBackend», который отлично подходит для большинства вещей, однако я бы хотел, чтобы пользовательские роли/разрешения динамически настраивались из браузера.

Я получаю список определений ACL в базе данных, которые появляются быть правильным, но при попытке чтения назад разрешения

Я первый включает модуль «аКЛ» в моем приложении, открыть соединение в базу данных и определить мои роли/доступ.

// https://www.npmjs.com/package/acl 
    var acl = require('acl'); 

    var ACL_PREFIX = 'acl_'; 
    var _ACL = new acl(new acl.mongodbBackend(mongoose.connection.db, ACL_PREFIX)); 

    // Some Sample ACL Definitions 
    var default_acl = [ 
     { 
      role: 'technician', 
      resources: ['workorders'], 
      permissions: ['view'] 
     }, 
     { 
      role: 'sales', 
      resources: ['workorders'], 
      permissions: ['add', 'edit', 'view', 'delete'], 
     }, 
     { 
      role: 'superadmin', 
      resources: ['workorders'], 
      permissions: ['*'] 
     } 
    ]; 

Я добавляю их сейчас, итерации по различным элементам ACL. (Я также попытался добавить их все сразу)

// Iterate Over each ACL Entry, I've also tried adding them all at once, eg: _ACL.allow(default_acl) 
    async.forEachSeries(default_acl, function (aclEntry, nextEntry) { 

     console.log("Giving the '%s' role access to %s [%s]", 
      aclEntry.role, aclEntry.resources.join(', '), aclEntry.permissions.join(', ') 
     ); 

     // Next Entry is the Callback to next item in the default_acl list. 
     _ACL.allow(aclEntry.role, aclEntry.resources, aclEntry.permissions, nextEntry) 

    }, function (doneDefiningACL) { 

     async.forEachSeries(['technician', 'sales', 'superadmin'], function (currentRole, nextRole) { 

      // Check Each role with 'allowedPermissions' 
      _ACL.allowedPermissions(currentRole, 'workorders', function (err, permissions) { 
       if(err) { 
        console.log("ERROR: %s", err); 
       } 

       console.log("\n-> Current Role: %s \n-> Permissions: %s\n", 
        currentRole, util.inspect(permissions) 
       ); 

       async.forEachSeries(['add', 'edit', 'view', 'delete'], function (action, nextAction) { 

        // Check Each Role with '.isAllowed' 
        _ACL.isAllowed(currentRole, 'workorders', action, function (err, canAccess) { 
         console.log("--> %s can '%s' workorders: %s", currentRole, action, util.inspect(canAccess)); 

         nextAction(); 
        }); 


       }, function (doneCheckingAllActions) { 
        nextRole(); 
       }); 
      }); 


     }, function (doneAllRoles) { 
      console.log("\n\nDone Generating ACL"); 
     }); 
    }); 

Это дает следующий результат при запуске:

Giving the 'technician' role access to workorders [view] 
    Giving the 'sales' role access to workorders [add, edit, view, delete] 
    Giving the 'superadmin' role access to workorders [*] 

    -> Current Role: technician 
    -> Permissions: { workorders: [] } 

    --> technician can 'add' workorders: false 
    --> technician can 'edit' workorders: false 
    --> technician can 'view' workorders: false 
    --> technician can 'delete' workorders: false 

    -> Current Role: sales 
    -> Permissions: { workorders: [] } 

    --> sales can 'add' workorders: false 
    --> sales can 'edit' workorders: false 
    --> sales can 'view' workorders: false 
    --> sales can 'delete' workorders: false 

    -> Current Role: superadmin 
    -> Permissions: { workorders: [] } 

    --> superadmin can 'add' workorders: false 
    --> superadmin can 'edit' workorders: false 
    --> superadmin can 'view' workorders: false 
    --> superadmin can 'delete' workorders: false 


    Done Generating ACL 

Если я пойду и взглянуть на базу данных MongoDB, я могу видеть, я есть 3 коллекции, которые были созданы:

// acl_meta collection: 
    > db.acl_meta.find(); 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e2"), "key" : "roles", "technician" : true, "sales" : true, "superadmin" : true } 

    // acl_resources collection: 
    > db.acl_resources.find(); 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e4"), "key" : "technician", "workorders" : true } 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e6"), "key" : "sales", "workorders" : true } 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e8"), "key" : "superadmin", "workorders" : true } 

    // acl_allows_workorders collection: 
    > db.acl_allows_workorders.find(); 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e3"), "key" : "technician", "view" : true } 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e5"), "key" : "sales", "add" : true, "edit" : true, "view" : true, "delete" : true } 
    { "_id" : ObjectId("57bdc84df251c5ae69d7c4e7"), "key" : "superadmin", "*" : true } 

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

UPDATE В .whatResources() функция, похоже, возвращается к каким ресурсам данной роль имеет доступ к правильно, но почему .isAllowed() и .allowedPermisions() функция не работает до сих пор загадка.

Например:

console.log("\n\nChecking What Resources Each Role Has Access To..."); 

    async.forEachSeries(['technician', 'sales', 'superadmin'], function (currentRole, nextRole) { 

     _ACL.whatResources(currentRole, function (err, resources) { 
      if(err) { 
       console.log("ERROR: %s", err); 
      } else { 
       console.log("\n-> %s's Have Access to The Following Resources: \n%s", currentRole, util.inspect(resources)); 

       nextRole(); 
      } 

     }); 


    }, function (doneCheckingWhatPermissionsEachRoleHas) { 
     console.log("\n\nDone Testing ACL"); 
    }); 

напечатает следующий вывод:

Checking What Resources Each Role Has Access To... 

    -> technician's Have Access to The Following Resources: 
    { workorders: [ 'view' ] } 

    -> sales's Have Access to The Following Resources: 
    { workorders: [ 'add', 'edit', 'view', 'delete' ] } 

    -> superadmin's Have Access to The Following Resources: 
    { workorders: [ '*' ] } 


    Done Testing ACL 

я хотел бы получить эту работу, используя 'isAllowed' и 'allowedPermissions', чтобы изменить это к использование 'whatResources' потребует реорганизации всех конфигураций политики ACL из исходной реализации memoryBackend в MeanJS.

Любые предложения?

ответ

0

В вашем коде я не вижу, чтобы вы использовали функцию addUserRoles (userId, roleId, function (err)). Возможно, это значит, что возвращает false. Я был таким же, вы можете читать here

Надейтесь на помощь.