В настоящее время я пытаюсь реализовать модуль 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.
Любые предложения?