Я готовлюсь к реализации урезанной версии управления доступом на основе ролей в моем приложении, и я Я обдумываю, как / что моделировать в моем хранилище документов , которое оказывается mongodb с mongoose.js в качестве моей "удобной библиотеки". Но этот вопрос должен относиться к любому хранилищу документов.
Кажется довольно обычным, что выбор между использованием встроенных объектов и ссылок является проблемой при использовании хранилища документов, учитывая конкурирующие факторы дублирования и производительности, а также другие факторы. Я стараюсь, чтобы RBAC был как можно более простым и не сходил с ума по вложенным идентификаторам коллекций / ссылок, что означало бы тонну циклов, используя заполнение мангуста и т. Д.
Вопрос:
Я уже склоняюсь к созданию коллекций для пользователей, разрешений и ролей; но имеет ли смысл моделировать операции и ресурсы или просто использовать для них ключи / значения?
См. Пример кода ниже или jsfiddle , который должен помочь понять проблему. Обратите внимание, что это совсем не тот способ, которым я хочу это реализовать, а просто способ изучить отношения!
/*
Imagine this being used in a CMS ;)
User: have a role property (e.g. role:"admin" or role:"writer")
Operation: Create,Read,Update,Delete,etc.
Resource: Page,Post,User, etc.
* For simplicity, we can represent operations and resource with simple strings.
Permission: A permission is an allowable "Operation" on a "Resource"
Role: A Role is just an abstraction of a set of possible "Permissions"
*/
// I could see this as a Permission model in mongo
var adminPerms = {
create: ['pages','posts', 'users'],
update: ['posts','pages','users'],
update_others: ['posts','pages'],
delete: ['posts','pages','users'],
read:['pages','posts','users']
};
// I could see this as a Role model in mongo
var admin = {
perms: adminPerms
};
var writerPerms = {
create: ['pages','posts'],
update: ['pages','posts'],
update_others: [],
delete: [],
read:['pages','posts']
};
var writer = {
perms: writerPerms
};
// Now we can just see if that user's perms has the operation on resource defined
function hasPerms(user, operation, resource) {
var i, len, op;
if(!user || !user.role || !operation || !resource) return false;
if(typeof rolemap[user.role] !== 'undefined' &&
typeof rolemap[user.role]['perms'] !== 'undefined' &&
typeof rolemap[user.role]['perms'][operation] !== 'undefined') {
op = rolemap[user.role]['perms'][operation];
for(i=0, len=op.length; i
РЕДАКТИРОВАТЬ: Предположим, что роли должны быть редактируемыми для каждого приложения, поэтому я могу разрешить администраторам управлять правами доступа; вот почему я хочу использовать базу данных.
Относительно выполнения всего этого внутри приложения, которое не будет работать, учитывая необходимость сохранения и возможного изменения. Тем не менее, одним из компромиссов в этом направлении является то, что я мог бы просто коллекцию ролей:
db.role.find({name:'writer'}).pretty()
{
"_id" : ObjectId("4f4c2a510785b51c7b11bc45"),
"name" : "writer",
"perms" : {
"create" : [
"posts",
"pages"
],
"update" : [
"posts",
"pages"
],
"update_others" : [ ],
"delete" : [ ],
"read" : [
"posts",
"pages"
]
}
}
И затем я мог бы внести изменения, такие как удаление и т. Д., Как показано ниже (при условии, что у меня уже есть ссылка на объект роли, полученный из mongo в точке звоните):
function removePerm(role, op, resource) {
if(!role || !role.perms || !role.perms[op]) {
console.log("Something not defined!");
return false;
}
var perm = role.perms[op];
for(var i=0, len=perm.length; i